騰訊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、下面程式的輸出結果為多少?
- void Func(char str_arg[100])
- {
- printf("%d\n",sizeof(str_arg));
- }
- int main(void)
- {
- char str[]="Hello";
- printf("%d\n",sizeof(str));
- printf("%d\n",strlen(str));
- char *p = str;
- printf("%d\n",sizeof(p));
- Func(str);
- }
10、C++將父類的解構函式定義為虛擬函式,下列正確的是哪個?
A、釋放父類指標時能正確釋放子類物件
B、釋放子類指標時能正確釋放父類物件
C、這樣做是錯誤的
D、以上全錯
11、下列哪一個不屬於關係資料庫的特點?
A、資料冗餘度小
B、資料獨立性高
C、資料共享性好
D、多使用者訪問
12、下面程式的輸出結果為多少?
- void Func(char str_arg[2])
- {
- int m = sizeof(str_arg);
- int n = strlen(str_arg);
- printf("%d\n",m);
- printf("%d\n",n);
- }
- int main(void)
- {
- char str[]="Hello";
- 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、給定一個字串,求出其最長的重複子串。
- B。若序列事先已經基本有序,則插入法和冒泡法會明顯減少比較次數,快速排序法與主元的選擇有關,若一般選子序列左側第一個元素比較,則第一個元素最好是大小居中的,以使得分成的兩個子陣列長度大致相等,效能才能最佳,所以快速排序也與初始輸入集有關的。堆排序受資料集輸入順序影響最小。
- B。Cache(高速緩衝器)容量小於主存,但速度快於主存,慢於CPU,相當於CPU和主存間的一個緩衝器,Cache中存放最近使用過的記憶體內容(基於最近使用過的內容很可能被再次使用的原理)。若CPU尋訪的內容在Cache中存放,則優先從Cache中讀取,稱為命中,否則稱為脫靶,脫靶只能從主存中讀取內容了。當Cache儲存滿的時候,用替換演算法清理掉不用的內容,保留下最新或最常使用的內容,稱為替換。Cache設計目標是提高命中率。替換演算法確實是影響Cache命中率,但還有Cache容量、儲存單元大小、組數多少、地址比較方法、寫操作方法等都會影響Cache命中率。
- 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。
- C。見實習生筆試裡的解釋。
- D。靜態成員只要不是const的,每個物件都對其進行可以修改,但注意靜態成員只有一份,修改後所有物件再訪問的時候,都是最近修改後的數值了。
- 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. 如下: