网易校招笔试题

来源:互联网 发布:有限电视和网络融合 编辑:程序博客网 时间:2024/04/29 22:48

1、对于一个内存地址是32位、内存页是8KB的系统。0X0005F123这个地址的页号与页内偏移分别是多少。

页面大小是8KB,那么页内偏移量是从0x0000(0)~ 0x1FFF(2的13次方 - 1)。0x5F123/8K=2E,余数是1123;则页号是47页,页内偏移量应该是0X00001123。


2、如果X大于0并小于65536,用移位法计算X乘以255的值为:    (X<<8)-X

X<<8-X是不对的,因为移位运算符的优先级没有减号的优先级高,首先计算8-X为0,X左移0位还是8。


3、一个包含n个节点的四叉树,每个节点都有四个指向孩子节点的指针,这4n个指针中有   3n+1   个空指针。


4、以下两个语句的区别是:第一个动态申请的空间里面的值是随机值,第二个进行了初始化,里面的值为0

[cpp] view plaincopy
  1. int *p1 = new int[10];  
  2. int *p2 = new int[10]();  


5、计算机在内存中存储数据时使用了大、小端模式,请分别写出A=0X123456在不同情况下的首字节是:

大端模式:0X12     小端模式:0X56        X86结构的计算机使用  小端   模式。

一般来说,大部分用户的操作系统(如windows, FreeBsd,Linux)是小端模式的。少部分,如MAC OS,是大端模式 的。


6、在游戏设计中,经常会根据不同的游戏状态调用不同的函数,我们可以通过函数指针来实现这一功能,请声明一个参数为int *,返回值为int的函数指针:int (*fun)(int *)


7、下面程序运行后的结果为:to test something

[cpp] view plaincopy
  1. char str[] = "glad to test something";  
  2.     char *p = str;  
  3.     p++;  
  4.     int *p1 = static_cast<int *>(p);  
  5.     p1++;  
  6.     p = static_cast<char *>(p1);  
  7.     printf("result is %s\n",p);  


8、在一冒险游戏里,你见到一个宝箱,身上有N把钥匙,其中一把可以打开宝箱,假如没有任何提示,随机尝试,问:

(1)恰好第K次(1=<K<=N)打开宝箱的概率是多少。  

(2)平均需要尝试多少次。

(1)(1-1/n)*(1-1/(n-1))*(1-1/(n-2))***(1/(n-k+1)) = 1/n

(2)这个就是求期望值,由于每次打开宝箱的概率都是1/n,则期望值为:   

1*(1/n)+2*(1/n)+3*(1/n)+......+n*(1/n) = (n+1)/2


9、头文件中ifndef / define / endif 是做什么用的?


10、代码里有时可以看到extern “C”,这语句是做什么用的?


11、输入格式:

第一行输入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

思路:这是一个典型的母函数问题,一般的典型母函数如 G(x)=  (1+x+x^2+x^3+x^4+x^5+....)*(1+x^2+x^4+x^6+x^8+x^10+....)*(1+x^3+x^6+x^9+x^12....).....

这个题目中的每个纸币只能够使用0次或1次,在上面的那个一般的母函数的基础上修改一下就行了,就很简单了。

具体代码如下:

[cpp] view plaincopy
  1. #include <iostream>  
  2. using namespace std;  
  3.   
  4. const int lmax=10000;  
  5. int c1[lmax+1],c2[lmax+1];  
  6.   
  7. int main(void)  
  8. {  
  9.     int m,n,i,j,k,a[110];  
  10.     //计算的方法还是模拟手动运算,一个括号一个括号的计算,从前往后  
  11.     while (cin>>m && m)  
  12.     {  
  13.         n=0;  
  14.         for(i = 0; i < m; i++)  
  15.         {  
  16.             scanf("%d",&a[i]);  
  17.             n += a[i];  
  18.         }  
  19.         n += 5;     //有可能无法表示的那个数比所有纸币面额的总和还要大  
  20.         for(i = 0; i <= n; i++)  
  21.         {  
  22.             c1[i] = 0;  
  23.             c2[i] = 0;  
  24.         }  
  25.         for(i = 0; i < 2*a[0]; i += a[0])        //母函数的表达式中第一个括号内的各项系数  
  26.             c1[i] = 1;  
  27.         //第一层循环是一共有 n 个小括号,而刚才已经算过一个了,所以是从2 到 n   
  28.         // i 就是代表的母函数中第几个大括号中的表达式  
  29.         for(i = 2; i <= m; i++)  
  30.         {  
  31.             for(j = 0; j <= n; j++)              //j 就是指的已经计算出的各项的系数  
  32.             {  
  33.                 for (k = 0; k < 2*a[i-1]; k += a[i-1])    //k 就是指将要计算的那个括号中的项  
  34.                 {   
  35.                     c2[j+k] += c1[j];        //合并同类项,他们的系数要加在一起,所以是加法  
  36.                 }  
  37.             }  
  38.             for(j = 0; j <= n; j++)  // 刷新一下数据,继续下一次计算,就是下一个括号里面的每一项  
  39.             {  
  40.                 c1[j] = c2[j];  
  41.                 c2[j] = 0;  
  42.             }  
  43.         }  
  44.         for(i = 1; i <= n; i++)  
  45.         {  
  46.             if(c1[i] == 0)  
  47.             {  
  48.                 cout<<i<<endl;      //找出第一个无法表示的纸币面额  
  49.                 break;  
  50.             }  
  51.         }  
  52.     }  
  53.     return 0;  
  54. }  

 

0 0