网易游戏(互娱)-游戏测试开发工程师真题 题解

题目链接:https://www.nowcoder.com/test/11647121/summary

题目难度:较低,如果不是第一题题目有问题看了很久的话,小编应该是20分钟就做完了。

选择题:

1.已知一棵二叉树的前序遍历是ABCDEFGH,那么它的中序遍历一定不可能是:

A. CBEDAGFH
B. BADCFEHG
C. DCEBFAHG
D. CBDAFEHG

无答案

没错,第一题题目应该错了……四个答案都是对的。还是言归正传说一下题目的考察点,二叉树的三种遍历,前序遍历的顺序为根左右,中序遍历的顺序为左根右,将答案和题目进行对比,每次通过前序遍历找到当前的树的根节点,再通过中序遍历来找到哪些是左子树哪些是右子树。

2.10000个人背上依次贴着从1到10000的编号,他们从小到大依次报数,偶数出列,一圈后,从剩下的5000人再次从号码小的开始报数,偶数出列,直到没人出列为止。问最后一次出列的人,背上的编号是多少?

A. 1
B. 2049
C. 4097
D. 8193

答案:D

注意看题,题目是问最后一次出列的人,不是最后一个人,这题是小编唯一错的题,因为想着1怎么都不会出列,所以一定是站在最后的,所以想都没想就选了A……言归正传,仔细分析,首先,每一次出局都会少一半的人,那么最后一轮一定是只剩下两个数序号为1 2 ,此时序号为2的出局,它就是最后一个,我们要求的就是它的编号。每一轮之后,剩下的人的的序号相当于除以2再加1,再分析,那么第i轮淘汰的第一个数,也就是第i轮序号为2的编号就是2^(i-1) + 1,所以我们只需要求出这个i即可,10000最多能除以2 14次,所以i就等于14,答案为8193

填空题:

3.

阅读下面那段代码,给出handle(1024,256)的返回值

  1.  handle(a, b) {  
  2.         if(a==0) return b;  
  3.         if(b==0) return a;  
  4.         i=a^b;  
  5.         j=(a&b)<<1;  
  6.         return  handle(i,j);  
  7.     }  

答案:1280

这道题就是考察我们对位运算的熟悉程度,此题出现的位运算为^异或运算、&位与运算、<<左移运算。那么我们来计算:

第一轮: a = 1024 ,  b = 256  ,  i = 1280,  j =  0

此时你会发现,第一轮结束的时候,b已经为0了,所以答案就是a也就是第一轮的i,1280.

4.

下面有段数字处理函数的伪代码,阅读后,请给出handle(12354)的返回值 1

  1. handle( num ){  
  2.     result = 0;  
  3.     i = num;
  4.    while (i !=0 )  
  5.     {  
  6.         i = i/10*10;  
  7.         result = result * 10 + num - i;  
  8.         i = i /10;  
  9.         num = num/10;  
  10.     }  
  11.     return result;  
  12. }  

答案:45321

题目的函数一看就是将这个数进行倒序输出,看不懂的自己跟着模拟一遍就懂了。

编程题:

5.一封奇怪的信:

题目描述:

现在你需要用一台奇怪的打字机书写一封书信。信的每行只能容纳宽度为100的字符,也就是说如果写下某个字符会导致行宽超过100,那么就要另起一行书写

信的内容由a-z的26个小写字母构成,而每个字母的宽度均会事先约定。例如字符宽度约定为[1,2,3,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],那么就代表'a'到'd'四个字母的宽度分别是1,2,3,4,而'e'到'z'的宽度均为5

那么按照上述规则将给定内容S书写成一封信后,这封信共有几行?最后一行宽度是多少?

解题思路分析:

这题题意很简单,我们只需要将过程模拟一遍即可,如果当前行不够了,则将当前字母放到下一行。

代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1000+5;
char str[maxn];
int main() {
    int num[30];
    for(int i=0; i<26; i++) {
        cin >> num[i];
    }
    cin >> str;
    int n = 0, len = 0;
    for(int i=0; i<strlen(str); i++) {
        int tot = num[str[i] - 'a'];
        if(len + tot > 100) {
            n++;
            len = tot;
        }
        else {
            len += tot;
        }
    }
    cout << n + 1 << " " << len << endl;
    return 0;
}

6.糖果谜题:

小明是幼儿园的一名老师。某天幼儿园园长给小朋友们每人发一颗糖果,小朋友们拿到后发现有一些同学拿到的糖果颜色和自己相同,有一些同学糖果颜色和自己不同。

假定每个小朋友只知道有多少同学和自己拿到了相同颜色的糖果。

上课后,有一部分小朋友兴奋的把这一结果告诉小明老师,并让小明老师猜一猜,最少有多少同学拿到了糖果。

例如有三个小朋友告诉小明老师这一结果如下:

其中第一个小朋友发现有1人和自己糖果颜色一样,第二个小朋友也发现有1人和自己糖果颜色一样,第三个小朋友发现有3人和自己糖果颜色一样。

第一二个小朋友可互相认为对方和自己颜色相同,比如红色;

第三个小朋友不可能再为红色(否则第一二个小朋友会发现有2人和自己糖果颜色相同),假设他拿到的为蓝色糖果,那么至少还有另外3位同学拿到蓝色的糖果,最终至少有6位小朋友拿到了糖果。

现在请你帮助小明老师解答下这个谜题。

解题思路分析:

首先,相同颜色的同学肯定和他们相同颜色的同学数量是相同的,这么说有点绕啊,举个例子,加入a,b,c同学的颜色一样,则他们能告诉老师都是有两个同学的颜色跟自己相同。再来分析人数的问题,如果有一个同学说有3个同学和自己的颜色相同,那么这里我们就能判断出一定是有4个同学的,假如此时还有一个同学说有3个同学和自己的颜色相同,那么从最少人数的角度讲,他们的颜色可以相同,这样的话我们确定的人数依然是4人,否则就会是8人,那么问题就变成了我们能将多少个同学统一到一个颜色里去。

#include <map>
#include <vector>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
map<int, int> Map;
vector<int> a;
int main() {
    int tot;
    while(cin >> tot) {
        a.push_back(tot);
        Map[tot]++;
    }
    int num = 0;
    for(int i=0; i<a.size(); i++) {
        int x = a[i];
        if(Map[x] <= 0) {
            continue;
        }
        while(Map[x] > 0) {
            num += x + 1;
            Map[x] -= x + 1;
        }
    }
    cout << num << endl;;
}

猜你喜欢

转载自blog.csdn.net/RaAlGhul/article/details/81388084