網易游戲2011招聘筆試題+答案解析


網易游戲 2011.10.15

1、對於一個內存地址是32位、內存頁是8KB的系統。0X0005F123這個地址的頁號與頁內偏移分別是多少?

 

2、如果X大於0並小於65536,用移位法計算X乘以255的值為?

 

3、一個包含n個節點的四叉樹,每個節點都有四個指向孩子節點的指針,這4n個指針中有          個空指針

 

4、以下兩個語句的區別是:

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

 

5、計算機在內存中存儲數據時使用了大、小端模式,請分別寫出A=0X123456在不同情況下的首字節是,大端模式:      小端模式:     X86結構的計算機使用     模式

 

6、在游戲設計中,經常會根據不同的游戲狀態調用不同的函數,我們可以通過函數指針來實現這一功能,請聲明一個參數為int *,返回值為int的函數指針:

 

 

7、下面程序運行后的結果為:

  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)平均需要嘗試多少次。

 

 

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

 

 

參考答案(歡迎討論) 轉載請注明來源 http://www.cnblogs.com/jerry19880126/

  1. 每頁是8KB,所以只要將地址除以8KB就行了,這里要用十六進制除法,0x5f123/0x2000,保留字節單位,將8K化成0x2000,除的結果是商2F,余數為1123,所以頁號是0x2F(十進制的47),偏移是0x1123。
  2. X*255=X*(256-1)=(X<<8)-X 這里的括號不能少,因為移位運算符的優先級較低。
  3. 3n+1。具體舉幾個例子就可以推出通項了。
  4. p1指向10個整型空間的首地址,每個整型空間里的值未初始化(為垃圾值),p2指向10個整型空間的首地址,每個整型空間里的值初始化為0。
  5. 大端模式:0x12,小端模式:0x56,X86采用的是小端模式。大端模式(又稱大尾模式)是“低對高,高對低”,即低地址存儲高字節,高地址存儲低字節。小端模式是“低對低,高對高”。
  6. int (*fun) (int*);
  7. 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 #include <iostream>
  2 using namespace std;
  3 
  4 struct Element
  5 {
  6     int power;
  7     int coeff;
  8 };
  9 
 10 //二分查找法,返回相應冪次,若沒有找到,則返回負數,這個負數+1取負,得到的正數表示的下標處前插
 11 int findPower(const Element* result,const int len, const int power)
 12 {
 13     //下面的方法同樣適用於len = 0的情況
 14     int low = 0;
 15     int high = len - 1;
 16     while(low <= high)
 17     {
 18         int mid = (low + high) / 2;
 19         if(power == result[mid].power)
 20         {
 21             return mid;
 22         }
 23         else if(power > result[mid].power)
 24         {
 25             low = mid + 1;
 26         }
 27         else
 28         {
 29             high = mid - 1;
 30         }
 31     }
 32     return -low - 1;
 33 }
 34 
 35 int generateFunction(int length, int* a)
 36 {
 37     if(length <= 0) return 0;
 38     // 求出a中各元素之和,以確定最大的分配空間
 39     int sum = 0;
 40     for(int i = 0; i < length; ++i)
 41     {
 42         sum += a[i];
 43     }
 44     Element *p1 = new Element[2];
 45     Element *p2 = new Element[2];
 46     Element *result = new Element[sum +1];
 47     p1[0].power = 0;
 48     p1[1].power = a[0];
 49     p1[0].coeff = 1;
 50     p1[1].coeff = 1;
 51     p2[0].power = 0;
 52     p2[0].coeff = 1;
 53     p2[1].coeff = 1;
 54     int index = 1;
 55     int resultLength = 0; // result數組的有效長度
 56     int p1Length = 2; // p1數組的有效長度
 57     while(index < length)
 58     {
 59         // 輸入p2的第二項的冪次
 60         p2[1].power = a[index++];
 61         for(int i = 0; i < p1Length; ++i)
 62         {
 63             Element temp = p1[i];
 64             for(int j = 0; j < 2; ++j)
 65             {
 66                 int power = p1[i].power + p2[j].power;
 67                 // 在 result 數組中查找相應的冪次,用二分查找法
 68                 int findIndex = findPower(result, resultLength, power);
 69                 if(findIndex < 0)
 70                 {
 71                     // 沒找到
 72                     findIndex = -(findIndex + 1);
 73                     for(int k = resultLength - 1; k >= findIndex; --k)
 74                     {
 75                         result[k + 1] = result[k];
 76                     }
 77                     // 插入新冪元素
 78                     Element ins;
 79                     ins.coeff = 1;
 80                     ins.power = power;
 81                     result[findIndex] = ins;
 82                     ++ resultLength;
 83                 }
 84                 else
 85                 {
 86                     // 找到了
 87                     ++result[findIndex].coeff;
 88                 }
 89             }
 90         }
 91         // 一組循環結束
 92         delete [] p1;
 93         p1 = result;
 94         p1Length = resultLength;
 95         resultLength = 0;
 96         result = new Element[sum];
 97     }
 98     // 遍歷result,尋找到欠缺的冪次
 99     for(int i = 1; i < p1Length; ++i)
100     {
101         if(p1[i].power != i)
102         {
103             delete [] p1;
104             delete [] p2;
105             delete [] result;
106             return i;
107         }
108     }
109     return 0;
110 }
111 
112 
113 //解決2011網易游戲招聘的最后一題
114 int main()
115 {
116     int a[5] = {1, 2, 3, 9, 100};
117     int b[5] = {1, 2, 4, 9, 100};
118     int c[5] = {1, 2, 4, 7, 100};
119     cout << generateFunction(5, a) << endl;
120     cout << generateFunction(5, b) << endl;
121     cout << generateFunction(5, c) << endl;
122 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM