1. 程式人生 > >騰訊2011年10月15日校招筆試+答案解析

騰訊2011年10月15日校招筆試+答案解析

1、下面的排序演算法中,初始資料集的排列順序對演算法的效能無影響的是()

A、插入排序                B、堆排序                 C、氣泡排序               D、快速排序

2、以下關於Cache的敘述中,正確的是()

A、CPU中的Cache容量應大於CPU之外的Cache容量

B、Cache的設計思想是在合理成本下提高命中率

C、Cache的設計目標是容量儘可能與主存容量相等

D、在容量確定的情況下,替換演算法的時間複雜度是影響Cache命中率的關鍵因素

3、資料儲存在磁碟上的排列方式會影響I/O服務的效能,一個圓環的磁軌上有10個物理塊,10個數據記錄R1------R10存放在這個磁軌上,記錄的安排順序如下表所示:

物理塊

1

2

3

4

5

6

7

8

9

10

邏輯記錄

R1

R2

R3

R4

R5

R6

R7

R8

R9

R10

假設磁碟的旋轉速度為20ms/周,磁碟當前處在R1的開頭處,若系統順序掃描後將資料放入單緩衝區內,處理資料的時間為4ms(然後再讀取下個記錄),則處理這10個記錄的最長時間為()

A、180ms                B、200ms              C、204ms                     D、220ms

4、隨著IP網路的發展,為了節省可分配的註冊IP地址,有一些地址被拿出來用於私有IP地址,以下不屬於私有IP地址範圍的是()

A、10.6.207.84            B、172.23.30.28            C、172.32.50.80               D、192.168.1.100

5、下列關於一個類的靜態成員的描述中,不正確的是()

A、該類的物件共享其靜態成員變數的值                          B、靜態成員變數可被該類的所有方法訪問                

C、該類的靜態方法只能訪問該類的靜態成員變數                 D、該類的靜態資料成員變數的值不可修改

6、已知一個線性表(38,25,74,63,52,48),假定採用雜湊函式h(key) = key%7計算雜湊地址,並雜湊儲存在散列表A【0....6】中,若採用線性探測方法解決衝突,則在該散列表上進行等概率成功查詢的平均查詢長度為()

A、1.5                  B、1.7                           C、2.0                       D、2.3

7、表示式“X=A+B*(C--D)/E”的字尾表示形式可以為()

A、XAB+CDE/-*=                     B、XA+BC-DE/*=                      C、XABCD-*E/+=                         D、XABCDE+*/=

8、()設計模式將抽象部分與它的實現部分相分離。

A、Singleton(單例)                                      B、 Bridge(橋接)                    

C、 Composite(組合)                                   D、 Facade(外觀)

9、下面程式的輸出結果為多少?

  1. void Func(char str_arg[100]) 
  2.     printf("%d\n",sizeof(str_arg)); 
  3. int main(void) 
  4.     char str[]="Hello"; 
  5.     printf("%d\n",sizeof(str)); 
  6.     printf("%d\n",strlen(str)); 
  7.     char *p = str; 
  8.     printf("%d\n",sizeof(p)); 
  9.     Func(str); 

10、C++將父類的解構函式定義為虛擬函式,下列正確的是哪個?
A、釋放父類指標時能正確釋放子類物件
B、釋放子類指標時能正確釋放父類物件
C、這樣做是錯誤的
D、以上全錯

11、下列哪一個不屬於關係資料庫的特點?
A、資料冗餘度小
B、資料獨立性高
C、資料共享性好
D、多使用者訪問

12、下面程式的輸出結果為多少?

  1. void Func(char str_arg[2]) 
  2.     int m = sizeof(str_arg);   
  3.     int n = strlen(str_arg);      
  4.     printf("%d\n",m); 
  5.     printf("%d\n",n); 
  6. int main(void) 
  7.     char str[]="Hello"; 
  8.     Func(str); 

13、typedef char *String_t; 和 #define String_d char * 這兩句在使用上有什麼區別?

14、到商店裡買200的商品返還100優惠券(可以在本商店代替現金)。請問實際上折扣是多少?

15、題目:已知rand7() 可以產生 1~7 的7個數(均勻概率),利用rand7()  產生rand10()   1~10(均勻概率)

16、給定能隨機生成整數1到5的函式,寫出能隨機生成整數1到7的函式。

17、對一個正整數作如下操作:如果是偶數則除以2,如果是奇數則加1,如此進行直到1時操作停止,求經過9次操作變為1的數有多少個?

演算法程式設計題:

1、給定一個字串,求出其最長的重複子串。

  1. B。若序列事先已經基本有序,則插入法和冒泡法會明顯減少比較次數,快速排序法與主元的選擇有關,若一般選子序列左側第一個元素比較,則第一個元素最好是大小居中的,以使得分成的兩個子陣列長度大致相等,效能才能最佳,所以快速排序也與初始輸入集有關的。堆排序受資料集輸入順序影響最小。
  2. B。Cache(高速緩衝器)容量小於主存,但速度快於主存,慢於CPU,相當於CPU和主存間的一個緩衝器,Cache中存放最近使用過的記憶體內容(基於最近使用過的內容很可能被再次使用的原理)。若CPU尋訪的內容在Cache中存放,則優先從Cache中讀取,稱為命中,否則稱為脫靶,脫靶只能從主存中讀取內容了。當Cache儲存滿的時候,用替換演算法清理掉不用的內容,保留下最新或最常使用的內容,稱為替換。Cache設計目標是提高命中率。替換演算法確實是影響Cache命中率,但還有Cache容量、儲存單元大小、組數多少、地址比較方法、寫操作方法等都會影響Cache命中率。
  3. C。這道題終於會做了。是這樣的原理,磁碟會一直朝某個方向旋轉,不會因為處理資料而停止。本題要求順序處理R1到R10,起始位置在R1,一週是20ms,共10個記錄,所以每個記錄的讀取時間為2ms。首先讀R1並處理R1,讀R1花2ms,讀好後磁碟處於R1的末尾或R2的開頭,此時處理R1,需要4ms,因為磁碟一直旋轉,所以R1處理好了後磁碟已經轉到R4的開始了,這時花的時間為2+4=6ms。這時候要處理R2,需要等待磁碟從R5一直轉到R2的開始才行,磁碟轉動不可反向,所以要經過8*2ms才能轉到R1的末尾,讀取R2需要2ms,再處理R2需要4ms,處理結束後磁碟已經轉到R5的開頭了,這時花的時間為2*8+2+4=22ms。等待磁碟再轉到R3又要8*2ms,加上R3自身2ms的讀取時間和4ms的處理時間,花的時間也為22ms,此時磁碟已經轉到R6的開頭了,寫到這裡,大家已經可以看到規律了,讀取並處理後序記錄都為22ms,所以總時間為6+22*9=204ms。
  4. C。見實習生筆試裡的解釋。
  5. D。靜態成員只要不是const的,每個物件都對其進行可以修改,但注意靜態成員只有一份,修改後所有物件再訪問的時候,都是最近修改後的數值了。
  6. C。解釋如下,先分別求這六個數的餘7後的結果,分別為3,4,4,0,3,6。列出一個表格,如下所示:

位置

0

1

2

3

4

5

6

記錄

63

48

38

25

74

52

查詢次數

1

3

1

1

2

4

38的餘數是3,所以放在3號位置對應的記錄裡,25放在位置4,74求餘的結果也是4,這就出現衝突了,線性探測就是往後移一格再存,所以放在5號位置了,按照這個方法依次放置到相應的位置。查詢時,比如此時查詢52,餘數是3,本應位於3號位置,但3號位置被38佔了,所以繼續向後查詢,4號位置沒有,5號位置也沒有,6號位置才查到,所以查詢次數就是4次了。平均查詢長度就是各數查詢次數之和/6。

7. C。字尾形式,複習一下,其實不難的,注意運算優先順序,”=”應是最後做的。

8. B。看看設計模式的書。

9. 6,5,4,4。第一個是求陣列的大小,不要忘了’\0’,第二個是求字串長度,注意strlen返回的長度是不包括’\0’的,指標的sizeof都是4位元組(32位系統)。函式中形參雖是陣列的形式,但實際傳入的是指標(陣列首地址),所以後面[100]其實沒有用,還是4位元組。

10. A。虛解構函式,C++多型。

11. D。

12. 4,5。同第9題解釋,函式中的[2]其實是沒有用的,因為只傳陣列首地址,就是指標,所以sizeof(指標)=4(32位系統),求strlen時是遇’\0’停止計數的,且不包括’\0’,所以是5。

13. 前者宣告一個型別的別名,在編譯時處理,有型別檢查;後者是一個簡單的替換,在預編譯時處理,無型別檢查。從使用上來說,String_t a,b; a和b都是char* 型別的,但String_d a,b; 只有a是char*型別的,b是char型的。

14. 需要自己去完善條件。比如優惠券本次消費是否就可以使用,還是要等到下次消費才可用,優惠券在消費多少時才可以使用等。舉個簡單的例子,比如只能下次消費使用,且滿200才可以使用其中的50元優惠券,這樣實際折扣為(200+200-50)/400=8.9折,繼續買下去,折扣可以在8折左右。

15.如下:

int rand10()
 {
  int temp;
 int temp2;
 do 
  {
  temp = rand7();
} while (temp > 5);//temp 1到5
  do 
 {
temp2 = rand7();
while (temp2 > 2);//temp2 1到2
return temp + (temp2 - 1) * 5;
}

16. 解法同15。

17. 最後一個必是2/2=1,前一個也必是4/2=2,再往前可以自己推幾個,可以發現從9th到5th間隔內的分叉數依次是0,1,1,2,3,5,每次分叉就會多出一個可能的數,找規律可以推測是Fabbonaci數列,所以結果應該1+1+2+3+5+8+13=33,別忘了即使是0分叉也包含了自身一個數,所以最終結果是34。

18. 如下: