网易游戏2011招聘笔试题+答案解析
2012-08-07 16:51
609 查看
网易游戏 2011.10.15
1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少?
2、如果X大于0并小于65536,用移位法计算X乘以255的值为?
3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有 个空指针
4、以下两个语句的区别是:
int *p1 = new int[10];
int *p2 = new int[10]();
5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式: 小端模式: X86结构的计算机使用 模式
6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:
7、下面程序运行后的结果为:
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = static_cast<int *>(p);
p1++;
p = static_cast<char *>(p1);
printf("result is %s\n",p);
8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。
(2)平均需要尝试多少次。
9、头文件中ifndef / define / endif 是做什么用的?
10、代码里有时可以看到extern “C”,这语句是做什么用的?
11、在下列乘法算式中,每个字母代表0~9的一个数字,而且不同的字母代表不同的数字:
ABCDEFGH
* AJ
------------------
EJAHFDGKC
BDFHAJEC
------------------
CCCCCCCCC
请写出推导的过程。
12、输入格式:第一行输入N(N<=100)表示流通的纸币面额数量;第二行N个纸币的具体表示的面额,从小到大排列,取值【1,10^6】。
输出格式:输出一个整数,表示应该发行的纸币面额,这个整数是已经发行的所有纸币面额都无法表示的最小整数。(已经发行的每个纸币面额最多只能使用一次)
参考答案(欢迎讨论) 转载请注明来源 http://www.cnblogs.com/jerry19880126/
每页是8KB,所以只要将地址除以8KB就行了,这里要用十六进制除法,0x5f123/0x2000,保留字节单位,将8K化成0x2000,除的结果是商2F,余数为1123,所以页号是0x2F(十进制的47),偏移是0x1123。
X*255=X*(256-1)=(X<<8)-X 这里的括号不能少,因为移位运算符的优先级较低。
3n+1。具体举几个例子就可以推出通项了。
p1指向10个整型空间的首地址,每个整型空间里的值未初始化(为垃圾值),p2指向10个整型空间的首地址,每个整型空间里的值初始化为0。
大端模式:0x12,小端模式:0x56,X86采用的是小端模式。大端模式(又称大尾模式)是“低对高,高对低”,即低地址存储高字节,高地址存储低字节。小端模式是“低对低,高对高”。
int (*fun) (int*);
to test something 注意++是根据类型跳的,int一下子会跳4个字节。
9. 预编译时防止头文件被重复包含。
10. 强调用C编译器来编码代码。
11. 这题非常伤脑筋。第一步能推出来的是K=0。第二步看到A*A=B,没有进位,因此A只能取0,1,2,3,0已经分给K了,而若A取1,则乘出来的结果应该很特殊,所以只能取2或3。假设A取3,则要求前一项AB的乘积不能有进位,但A*A=9,B=9,A*B=27,一定会出现进位,这样就矛盾了,A只能取2。第三步看A*A的进位是E,A是2,2*2=4,进位是来自前一项的,前一项进位最多是7(最大数乘8*9=72),所以E只能取1。第四步把G推出来,乘法中有A*G=E的项,而A为2,E为1,E是奇数,说明有来自前一位的进位(这个进位最大只能是1,因为A只有2),G只有取5。第五步把B推出来,注意加法中有两项E+B=C和G+E=C,都能得到C,而加法进位最多为1,所以推出G与B相差一位,K+C是不可能有进位的(因为K=0),这样B就比G小1,所以B为4。第六步终于可以把C推出来了,G和E知道,而前一项加法不可能有进位,所以C一定是6。第七步可以推H了,2*H=6,H可以取3或8,假设H取3,则J*H=C项要求J只取2,与A=2矛盾,所以H只能取2。第八步顺便把J推出来了,J不能取2了,只能取7。第九步把剩下的F解决了,已经推出很多项了,F硬算也能算出来为3。第十步不用说,D=9,再检查一遍,都满足条件。
12. 母函数问题,具体代码如下。思想是将1的取与不取表示成(1+x),若取1则表示不用1块钱纸币,取x则表示用这个一块钱;同样,将3的取与不取表示成(1+x^3),若取1则表示不用这个三块钱,取x^3则表示用这个三块钱。(1+x)(1+x^2)(1+x^3)(1+x^9)(1+x^100),这样乘开来,看看x的幂缺哪些,第一个缺的就是题中要求的答案了。
1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少?
2、如果X大于0并小于65536,用移位法计算X乘以255的值为?
3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有 个空指针
4、以下两个语句的区别是:
int *p1 = new int[10];
int *p2 = new int[10]();
5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是,大端模式: 小端模式: X86结构的计算机使用 模式
6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:
7、下面程序运行后的结果为:
char str[] = "glad to test something";
char *p = str;
p++;
int *p1 = static_cast<int *>(p);
p1++;
p = static_cast<char *>(p1);
printf("result is %s\n",p);
8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:
(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。
(2)平均需要尝试多少次。
9、头文件中ifndef / define / endif 是做什么用的?
10、代码里有时可以看到extern “C”,这语句是做什么用的?
11、在下列乘法算式中,每个字母代表0~9的一个数字,而且不同的字母代表不同的数字:
ABCDEFGH
* AJ
------------------
EJAHFDGKC
BDFHAJEC
------------------
CCCCCCCCC
请写出推导的过程。
12、输入格式:第一行输入N(N<=100)表示流通的纸币面额数量;第二行N个纸币的具体表示的面额,从小到大排列,取值【1,10^6】。
输出格式:输出一个整数,表示应该发行的纸币面额,这个整数是已经发行的所有纸币面额都无法表示的最小整数。(已经发行的每个纸币面额最多只能使用一次)
输入 | 输出 |
5 1 2 3 9 100 | 7 |
5 1 2 4 9 100 | 8 |
5 1 2 4 7 100 | 15 |
每页是8KB,所以只要将地址除以8KB就行了,这里要用十六进制除法,0x5f123/0x2000,保留字节单位,将8K化成0x2000,除的结果是商2F,余数为1123,所以页号是0x2F(十进制的47),偏移是0x1123。
X*255=X*(256-1)=(X<<8)-X 这里的括号不能少,因为移位运算符的优先级较低。
3n+1。具体举几个例子就可以推出通项了。
p1指向10个整型空间的首地址,每个整型空间里的值未初始化(为垃圾值),p2指向10个整型空间的首地址,每个整型空间里的值初始化为0。
大端模式:0x12,小端模式:0x56,X86采用的是小端模式。大端模式(又称大尾模式)是“低对高,高对低”,即低地址存储高字节,高地址存储低字节。小端模式是“低对低,高对高”。
int (*fun) (int*);
to test something 注意++是根据类型跳的,int一下子会跳4个字节。
9. 预编译时防止头文件被重复包含。
10. 强调用C编译器来编码代码。
11. 这题非常伤脑筋。第一步能推出来的是K=0。第二步看到A*A=B,没有进位,因此A只能取0,1,2,3,0已经分给K了,而若A取1,则乘出来的结果应该很特殊,所以只能取2或3。假设A取3,则要求前一项AB的乘积不能有进位,但A*A=9,B=9,A*B=27,一定会出现进位,这样就矛盾了,A只能取2。第三步看A*A的进位是E,A是2,2*2=4,进位是来自前一项的,前一项进位最多是7(最大数乘8*9=72),所以E只能取1。第四步把G推出来,乘法中有A*G=E的项,而A为2,E为1,E是奇数,说明有来自前一位的进位(这个进位最大只能是1,因为A只有2),G只有取5。第五步把B推出来,注意加法中有两项E+B=C和G+E=C,都能得到C,而加法进位最多为1,所以推出G与B相差一位,K+C是不可能有进位的(因为K=0),这样B就比G小1,所以B为4。第六步终于可以把C推出来了,G和E知道,而前一项加法不可能有进位,所以C一定是6。第七步可以推H了,2*H=6,H可以取3或8,假设H取3,则J*H=C项要求J只取2,与A=2矛盾,所以H只能取2。第八步顺便把J推出来了,J不能取2了,只能取7。第九步把剩下的F解决了,已经推出很多项了,F硬算也能算出来为3。第十步不用说,D=9,再检查一遍,都满足条件。
12. 母函数问题,具体代码如下。思想是将1的取与不取表示成(1+x),若取1则表示不用1块钱纸币,取x则表示用这个一块钱;同样,将3的取与不取表示成(1+x^3),若取1则表示不用这个三块钱,取x^3则表示用这个三块钱。(1+x)(1+x^2)(1+x^3)(1+x^9)(1+x^100),这样乘开来,看看x的幂缺哪些,第一个缺的就是题中要求的答案了。
#include <iostream> using namespace std; struct Element { int power; int coeff; }; //二分查找法,返回相应幂次,若没有找到,则返回负数,这个负数+1取负,得到的正数表示的下标处前插 int findPower(const Element* result,const int len, const int power) { //下面的方法同样适用于len = 0的情况 int low = 0; int high = len - 1; while(low <= high) { int mid = (low + high) / 2; if(power == result[mid].power) { return mid; } else if(power > result[mid].power) { low = mid + 1; } else { high = mid - 1; } } return -low - 1; } int generateFunction(int length, int* a) { if(length <= 0) return 0; // 求出a中各元素之和,以确定最大的分配空间 int sum = 0; for(int i = 0; i < length; ++i) { sum += a[i]; } Element *p1 = new Element[2]; Element *p2 = new Element[2]; Element *result = new Element[sum +1]; p1[0].power = 0; p1[1].power = a[0]; p1[0].coeff = 1; p1[1].coeff = 1; p2[0].power = 0; p2[0].coeff = 1; p2[1].coeff = 1; int index = 1; int resultLength = 0; // result数组的有效长度 int p1Length = 2; // p1数组的有效长度 while(index < length) { // 输入p2的第二项的幂次 p2[1].power = a[index++]; for(int i = 0; i < p1Length; ++i) { Element temp = p1[i]; for(int j = 0; j < 2; ++j) { int power = p1[i].power + p2[j].power; // 在 result 数组中查找相应的幂次,用二分查找法 int findIndex = findPower(result, resultLength, power); if(findIndex < 0) { // 没找到 findIndex = -(findIndex + 1); for(int k = resultLength - 1; k >= findIndex; --k) { result[k + 1] = result[k]; } // 插入新幂元素 Element ins; ins.coeff = 1; ins.power = power; result[findIndex] = ins; ++ resultLength; } else { // 找到了 ++result[findIndex].coeff; } } } // 一组循环结束 delete [] p1; p1 = result; p1Length = resultLength; resultLength = 0; result = new Element[sum]; } // 遍历result,寻找到欠缺的幂次 for(int i = 1; i < p1Length; ++i) { if(p1[i].power != i) { delete [] p1; delete [] p2; delete [] result; return i; } } return 0; } //解决2011网易游戏招聘的最后一题 int main() { int a[5] = {1, 2, 3, 9, 100}; int b[5] = {1, 2, 4, 9, 100}; int c[5] = {1, 2, 4, 7, 100}; cout << generateFunction(5, a) << endl; cout << generateFunction(5, b) << endl; cout << generateFunction(5, c) << endl; }
相关文章推荐
- 网易游戏2011招聘笔试题+答案解析
- 网易游戏2011招聘笔试题+答案解析
- 百度2011招聘笔试题+答案解析
- 百度2011招聘笔试题+答案解析
- 网易招聘笔试题+答案解析
- 网易游戏2011招聘笔试题
- 百度2011招聘笔试题+答案解析
- 百度2011招聘笔试题+答案解析
- 十月下旬腾讯,网易游戏,百度最新校园招聘笔试题集锦(第271-330题)
- 腾讯 美团 百度 网易游戏 2015校园招聘南京笔试面试之总结分析
- 网易互娱2017实习生招聘游戏研发工程师在线笔试第二场(神奇的数)
- 十月下旬腾讯,网易游戏,百度迅雷校园招聘笔试题集锦(第271-330题)
- 2017网易游戏雷火盘古实习生招聘笔试真题:字符串编码 [python]
- 网易游戏2011.10.15校园招聘会笔试题
- 网易游戏2016实习生招聘笔试题目--井字棋
- 网易游戏2016校园招聘笔试题(一)
- 网易游戏2016校园招聘“游戏研发&平台开发”在线笔试——B题 Best Compression Algorithms
- 网易游戏2011校园招聘
- 网易游戏2016实习生招聘在线笔试之连连看
- 网易游戏2016实习生招聘笔试题目--推箱子