騰訊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.  
  4. int main(void) 
  5.     char str[]="Hello"; 
  6.     printf("%d\n",sizeof(str)); 
  7.     printf("%d\n",strlen(str)); 
  8.     char *p = str; 
  9.     printf("%d\n",sizeof(p)); 
  10.     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、給定一個字符串,求出其最長的重復子串。

 

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

  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.如下:

 1 int rand10()
 2 {
 3 int temp;
 4 int temp2;
 5 do 
 6 {
 7 temp = rand7();
 8 } while (temp > 5);//temp 1到5
 9 do 
10 {
11 temp2 = rand7();
12 while (temp2 > 2);//temp2 1到2
13 return temp + (temp2 - 1) * 5;
14 }

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. 如下:

View Code
 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <vector>
 5 
 6 using namespace std;
 7 
 8 class LongestCommonString
 9 {
10     vector<string> suffixArray;
11     size_t len;
12 public:
13 
14     //構造方法
15     LongestCommonString(string s)
16     {
17         //構造后綴數組
18         for(size_t i = 0; i < s.length(); ++i)
19         {
20             suffixArray.push_back(s.substr(i));
21         }
22         //排序
23         sort(suffixArray.begin(), suffixArray.end());
24         len = suffixArray.size();
25     }
26 
27     //兩兩比較,返回最長長度的子串
28     string lcpCompare()
29     {
30         size_t maxLength = 0;
31         size_t index = 0;
32         for(size_t i = 0; i < len - 1; ++i)
33         {
34             size_t temp = lcp(suffixArray.at(i), suffixArray.at(i+1));
35             if(temp > maxLength)
36             {
37                 maxLength = temp;
38                 index = i;
39             }
40         }
41         return suffixArray.at(index).substr(0, maxLength);
42     }
43 
44     //返回重復的長度
45     size_t lcp(const string& a, const string& b)
46     {
47         size_t i = 0;
48         while(a[i] == b[i])
49         {
50             ++i;
51         }
52         return i;
53     }
54 };
55 
56 int main()
57 {
58     string h = "hello";
59     //cout << h.substr(2, 3);
60     string word = "aacaagmtttacaagmc";
61     LongestCommonString slcp(word);
62     cout << "最長重復子串為:" << slcp.lcpCompare() << endl;
63 }

 

 


免責聲明!

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



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