2018年爱奇艺校招笔试
Posted asimple
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2018年爱奇艺校招笔试相关的知识,希望对你有一定的参考价值。
我选的是前端方向,所以编程题的题目也比较简单,但是坑很多呀,不知道错在哪,最后没办法直接用最暴力的方法AC了。
笔试分为选择和编程,选择20个,每个三分,编程题两道每道20分。
选择题考点:
1、数据结构(包括大顶堆、希尔排序、B-树、以及hash)
2、计算机网络(只考了一两题,TCP和UDP)
3、html/CSS(CSS3、翻书效果怎么实现、一张图上映射多个区域)
4、JS(禁止前进和后退、作用域)
我有印象的应该就是作用域的这个题了:
下面这个代码输出什么(如果我没记错,应该就是原题目)
<!DOCTYPE html> <html> <script> function func() { document.write(a); document.write(fun); var a = 1; function fun(){ return 2; } } </script> <body> <a onclick="func()">点击我</a> </body> </html>
编程题:其实都挺简单的,但是第一题我没想对坑点,我想到的点似乎都没这样的数据。
第一题:
幸运ID
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 131072KB;其他语言 655360KB
题目描述:
小C有一张票,这张票的ID是长度为6的字符串,每个字符都是数字,他想让这个ID变成他的辛运ID,所以他就开始更改ID,每一次操作,他可以选择任意一个数字并且替换它。
如果这个ID的前三位数字之和等于后三位数字之和,那么这个ID就是辛运的。你帮小C求一下,最少需要操作几次,能使ID变成辛运ID
输入
输入只有一行,是一个长度为6的字符串。
输出
输出这个最小操作次数
样例输入
000000
样例输出
0
Hint
输入样例2
000018
输出样例2
1
样例解释:将前三位任意一个改为9即可满足条件,操作数为1
AC代码:(直接暴力贪心解决)
// Asimple #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <string> #include <cstring> #include <cmath> using namespace std; typedef long long ll;const int maxn = 100000+5; ll n, m, T, len, cnt, num, ans, Max, k; string str; int max_a[3], min_a[3]; void input(){ while( cin >> str ) { int sum1 = 0, sum2 = 0; for(int i=0; i<6; i++) { if( i < 3 ) sum1 += (str[i]-‘0‘); else sum2 += (str[i]-‘0‘); } int cnt = abs(sum1-sum2); if( sum1>sum2 ) { for(int i=0; i<6; i++) { if( i<3 ) max_a[i] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); else min_a[i-3] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); } } else { for(int i=0; i<6; i++) { if( i>=3 ) max_a[i-3] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); else min_a[i] = max((str[i]-‘0‘), 9-(str[i]-‘0‘)); } } sort(max_a, max_a+3); sort(min_a, min_a+3); int res = 0, j = 2, i = 2; while( cnt > 0 ) { int te = max(max_a[i], min_a[j]); cnt -= te; if( te == max_a[i] ) i--; else j --; res ++; } cout << res << endl; } } int main() { input(); return 0; }
91%代码(第一版就是91%,之后改的只降不升,最后十分钟无能为力只能暴力AC,求大神找出坑点)
// Asimple #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <queue> #include <vector> #include <string> #include <cstring> #include <stack> #include <set> #include <map> #include <cmath> using namespace std; typedef long long ll;const int maxn = 100000+5; ll n, m, T, len, cnt, num, ans, Max, k; //vector<int> a[maxn]; string str; int a[10]; void input(){ while( cin >> str ) { memset(a, sizeof(a), 0); int sum1 = 0, sum2 = 0; for(int i=0; i<6; i++) { if( i < 3 ) sum1 += (str[i]-‘0‘); else sum2 += (str[i]-‘0‘); } int cnt = abs(sum1-sum2); int res = cnt/9 + (cnt%9!=0); // 下面这个判断是我想的坑点 // 但是没有下面的语句一样也是91% if( cnt == 9 ) { if( a[0]+a[9] == 0 ) res++; } else if( cnt == 18 ) { if( a[0]+a[9]<2 ) res ++; } cout << res << endl; } // pas; } int main() { input(); return 0; }
第二题:
局长的食物
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 131072KB;其他语言 655360KB
题目描述:
局长有N种食物,每种食物有Ai份。
每天局长会吃一份食物,或者买一份食物(即每天只能进行吃或买其中的一种动作),这样过了M天
现在局长想知道M天后第p种食物的份数排名(从大到小,相同算并列,例如3 3 2,则排名为1 1 3)
N,M,P<=100,Ai<=1000
输入
第一行N M P
第二行N个数Ai
接下来M行,每行A i或者B i分别表示买一份食物i,吃一份食物i
输出
一个答案
样例输入
3 4 2
5 3 1
B 1
A 2
A 2
A 3
样例输出
1
简单排序,注意名次的增加就好
AC代码:
// Asimple #include <iostream> #include <algorithm> #include <cstdio> #include <cstdlib> #include <queue> #include <vector> #include <string> #include <cstring> #include <stack> #include <set> #include <map> #include <cmath> #define INF 0x3f3f3f3f #define debug(a) cout<<#a<<" = "<<a<<endl #define test() cout<<"============"<<endl #define CLS(a,v) memset(a, v, sizeof(a)) #define pas system("pause") using namespace std; typedef long long ll; typedef unsigned long long ull; int dx[] = {-1,1,0,0,-1,-1,1,1}, dy[]={0,0,-1,1,-1,1,1,-1}; const int maxn = 1000+5; const ll mod = 1000000007; ll n, m, T, len, cnt, num, ans, Max, k; //vector<int> a[maxn]; struct node{ int ind; int sum; bool operator < (const node& a) const { return sum>a.sum; } }; node a[maxn]; void input(){ int p; while( cin >> n >> m >> p ) { for(int i=1; i<=n; i++) { cin >> a[i].sum; a[i].ind = i; } char ch; while( m -- ) { cin >> ch >> num; if( ch == ‘A‘ ) { a[num].sum ++; } else { if( a[num].sum>0) a[num].sum --; } } sort(a+1, a+n+1); int cnt = 0, te = 1; a[0].sum = -1; for(int i=1; i<=n; i++) { if( a[i].sum !=a[i-1].sum ) { cnt += te; te = 1; } else { te ++; } if( a[i].ind == p ) { cout << cnt << endl; break; } } } // pas; } int main() { input(); return 0; }
以上是关于2018年爱奇艺校招笔试的主要内容,如果未能解决你的问题,请参考以下文章