2017网易有道内推笔试回顾

这次内推的笔试考试感觉就是挺杂的,考题没有区分大的方向。ios和研发工程师的题目没区别。编程题也是一样,就是顺序换了下,所以编程题也没有难度梯度的区分,有些不科学。扯这么多其实感觉还是自己的基础不扎实,得加油了。

下面回忆一下考到了什么。

选择题(单选和多选,2分×15题=30分)

这边只能大致回忆起一些知识点了

1.Linux下管道命令来统计for循环的次数会用到哪些指令? (多选)选项: cat、wc、grep、vi

2.解释和编译的比较,效率,是否生成本地文件,是否独立于机器等

3.B-数的根结点的关键字数量的最大和最小值

4.xml相关知识点:xml的方式、根节点的数量、是哦副可以嵌套

5.json的相关知识点

6.位密度

7.intent和action的相关知识点:对应关系,默认值、隐式intent、scheme等

8.类概率密度

9.根据前序和中序输出后序遍历结果

10.关于访问权限,c++中class的默认访问权限,public、private、protected等

11.一道程序输出结果的题目。

12.循环队列元素个数,不太严谨的出题,没有说明队尾是元素还是空填充。

选择题就记得这么多了,多选单选交替,感觉知识点牵扯有点多。

编程题(3题×30=90分)

下面描述的编程题都是大致的题意,仅供参考。

第一题
小明实现了一个队列。
队列里依次的操作如下:
取队列队首元素,保存在x中。
将队首元素插入到队尾
删除队首元素
输出新的队首元素

while(!Q.empty())              //队列不空,执行循环
        {
                   int x=Q.front();            //取出当前队头的值x
                   Q.pop();                 //弹出当前队头
                  Q.push(x);               //把x放入队尾
                   x=Q.front();              //取出这时候队头的值
                  printf("%d\n",x);          //输出x
                  Q.pop();                 //弹出这时候的队头
       }

测试用例要求:

输入:

4  //这个是总的输入此数,下面为n的大小
1
3  //原题有误,上面是5  
2
10

输出:

1
2 1
2 1 3
8 1 6 2 10 3 7 4 9 5

此时他发现输出的元素是按照1,2,3,4,5...n有序排列的,求原始队列元素的顺序。
[思路1:数组初始化为空,按照空1填1的原则将数字塞入数组之中,已经填充过的那一位下次遍历的时候不计入其中]

我的代码:笔试当天想到思路了,就是有些生疏,没有写出来,还是练得少了,今天写了。感觉思路还是不太好。

 1 #include <iostream>
 2 #include <memory.h>
 3 using namespace std;
 4 void  findAndInsert(int *a,int num,int &,int);
 5 int main()
 6 {
 7     int time;
 8     int n;
 9     cin>>time;
10     while(time--){
11         cin>>n;
12         int *a=new int[n];
13         memset(a,0,n*4);
14         int num=1;
15         int position=0;
16         //n次循环插入n个数字到指定的位置
17         while(num<=n){
18             //寻找对应的坑并插入
19            findAndInsert(a,num,position,n);
20            num++;
21         }
22         for(int i=0;i<n-1;i++)
23             cout<<a[i]<<" ";
24         cout<<a[n-1]<<endl;
25         delete []a;
26     }
27 
28 }
29 
30 
31 void  findAndInsert(int *a,int num,int &position,int n){
32        for(int i=0;i<n;i++){
33         if(a[position]==0){
34                 position++;
35           if(position>=n)
36                 position=position%n;
37           break;
38         }
39         else
40         {
41             position++;
42             if(position>=n)
43                 position=position%n;
44         }
45        }
46        for(int i=0;i<n;i++){
47         if(a[position]==0){
48           a[position]=num;
49           break;
50         }
51         else
52         {
53             position++;
54             if(position>=n)
55                 position=position%n;
56         }
57        }
58 
59 
60 }

 

第二题
洗牌
有一副牌2n张。1,2,3...2n
分成两叠,左手1-n,右手n+1-2n,首先取出右手的最后一张牌2n,左手的最后一张n,然后是两边的倒数第二张。依次类推。然后把牌面反过来。
如n=3,牌1,2,3,4,5,6
则一次洗牌的结果是1,4,2,5,3,6
第二次洗牌的结果是1,5,4,3,2,6
请输出k的洗牌后的结果。

[思路1:其实就是两队中各取一张牌,直到取完为止。注意洗牌有次数控制]

笔试的时候我写的代码,太繁杂。

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 void exchange(vector<int> &);
 5 int main()
 6 {
 7     int times;
 8     int n,k;
 9     int card;
10     cin>>times;
11     while(times--)
12     {
13         vector<int> v;
14         cin>>n>>k;
15         for(int i=0;i<2*n;i++)
16             {
17                 cin>>card;
18                 v.push_back(card);
19             }
20         for(int i=0;i<k;i++)
21             exchange(v);
22         for(int i=0;i<2*n-1;i++)
23             cout<<v[i]<<" ";
24         cout<<v[2*n-1]<<endl;
25         v.clear();
26     }
27 }
28 
29 
30 void exchange(vector<int> &v)
31 {
32     int n=v.size()/2;
33     vector<int> temp;
34     for(int i=0;i<n;i++)
35     {
36         temp.push_back(v[i]);
37         temp.push_back(v[i+n]);
38     }
39     for(int i=0;i<v.size();i++)
40         v[i]=temp[i];
41     temp.clear();
42 }

 

第三题
矩形
给出n条边的首尾顶点坐标,输出组成矩形的对角坐标。(这题具体记不清了,没写)

 

posted @ 2016-08-17 22:51  csbdong  阅读(753)  评论(0)    收藏  举报