2014年騰訊暑期實習筆試題(含分析)
這是第二次來參加騰訊的筆試了,感覺和往年的試題差別不大,考得比較基礎,內容也基本集中在C++,資料結構,作業系統部分,計算機網路部分。騰訊的筆試題選擇題貌似每年都是不定項選擇,熟話說不怕單項,不怕多項,最怕不定項,在不知道怎麼做的情況下要想蒙對很不容易啊,據說蒙對的概率是4%,廢話不多,直接上題,上面是我做的一些答案,望大牛們批評指正!
一、不定項選擇題(共25題,每題4分)
1. 關於二叉樹,下面說法正確的是(BC)
A. 對於n個節點的二叉樹,其高度為nlog2n;
B. 一個具有1025個節點的二叉樹,其高度範圍在11~1025之間
C. 二叉樹的先序遍歷是EFHIGJK,中序遍歷為HFIEJKG,該二叉樹的右子樹的根為G
D. 二叉樹中至少有一個節點的度為2
分析:
A. 高度最大為n,最小為log2 n,排除
B. 正確。
C. 二叉樹為:
E
F G
H I J
K
D.如果二叉樹只有一個根節點,那麼度為0,排除
2. 假設函式f1的時間複雜度O(n),那麼f1*f1的時間複雜度為(A)
A. O(n)B. O(n*n)C. O(n*log(n))D. 以上都不對
3. 對下列四種排序方法,在排序中關鍵字比較次數與記錄初始化順序無關的是(B)
A. 直接插入B. 二分法插入C. 快速排序D. 歸併排序
分析:此題有待商榷。
4. 已知一段文字有1382個字元,使用了1382個位元組儲存,這段文字全部是由a、b、c、d、e字元組成,a 354次,b483次,c 227次,d 96次,e 222次,對這5個字元使用哈夫曼編碼。則以下說法正確的是?(ACD ?)
A. 使用哈夫曼編碼後,使用編碼值來儲存這段文字將花費最少的儲存空間
B. 使用哈夫曼編碼後,a,b,c,d,e這5個字元對應的編碼值是唯一確定的
C.使用哈夫曼編碼後,a,b,c,d,e 這5個字元對應的編碼值可以有多套,但每個字元的編碼位數是確定的
D. b這個字元的編碼位數最短,d這個字元的哈夫曼編碼位數應該最長
分析:
可以確定B肯定不對,C肯定對。但是選項
5. 判斷單鏈表有沒有環的演算法中,至少需要幾個指標(B)
A. 1 B. 2 C. 3 D. 4
分析:
此題在各大公司的筆試和麵試中都出現過,都與本題比較像,建議大家去做一下下面幾題:
1. 給定單鏈表,檢測是否有環。
2. 給定兩個單鏈表(head1, head2),檢測兩個連結串列是否有交點,如果有返回第一個交點。
3.給定單鏈表(head),如果有環的話請返回從頭結點進入環的第一個節點。
本題的做法是:使用兩個指標p1,p2從連結串列頭開始遍歷,p1每次前進一步,p2每次前進兩步。如果p2到達連結串列尾部,說明無環,否則p1、p2必然會在某個時刻相遇(p1==p2),從而檢測到連結串列中有環。
6. 在編譯過程中,產生Parse tree的過程是(A)
A. 語法分析 B. 語義分析階段 C. 詞法分析D. 目的碼生成階段
7. 閱讀下面程式碼,程式會打印出來的值是(D)
#include
void f(char **p){
*p += 2;
}
void main() {
char *a[] = {“123”,”abc”,”456”},**p;
p = a;
f(p);
printf(“%s\r\n”,*p);
}
A. 123 B. abc C. 456 D. 3
8. char p1[] = “Tencent”, void p2= malloc((10)在32位機器上sizeof(p1)和sizeof(p2)對應的值是(C)
A. 8:0 B. 4:10 C. 8:4 D. 4:4
分析:在這份試卷中多處考到了sizeof這個運算子,歷年的考題中也出現的比較多,因此值得重視。這裡簡單說明一下sizeof(p),如果p是指標那麼就是指標的儲存的長度,在32位機上就是4個位元組;如果是陣列,那麼就是陣列儲存的長度,也就是陣列長度乘以單個元素儲存位元組。
9. 現在有以下兩個函式,呼叫test的結果是(D?)
char* getMem(void) {
char p[] = “hello world ”;
p[5] = 0x0;
return p;
}
void test(void) {
char *s = 0x0;
s = getMem();
printf(s);
}
A. hello B. 無輸出 C. Hello0world D. 不確定
分析:
此題在我考試時選的是A,回來測試了一下輸出結果卻是不確定的,對此我比較疑惑,哎,我的C++並不好,望大神給點指示。
10. 馮諾依曼體系結構計算機的基本原理是(D)
A資訊儲存 B 儲存智慧 C 數字控制 D 儲存程式和程式控制
11.下面程式碼中解構函式(1)和(2)的呼叫順序是(C)
class base{
public:
~base(){} //(1)
};
class child:public base{
public:
~child(){} //(2)
};
int main(){
base *b = new child();
delete b;
}
A. 先呼叫(1)再呼叫(2) B.先呼叫(2)再呼叫(1)
C.只調用(1) D.只調用(2)
分析:
注意本題中的解構函式並不是虛擬函式,所以只會呼叫變數本身型別的解構函式,也就是隻會呼叫(1).如果是虛解構函式,則會先呼叫(2)再呼叫(1)。
12.下面哪種設計模式的定義為:定義物件間的一種一對多的關係,當一個物件改變時,其他依賴於他的物件都能夠得到通知並自動更新。(C)
A. VisitorB. Adapter C. Observer D. Interpreter
分析:
建議大家看一下常用的設計模式,在筆試和麵試中經常遇到。比如常用的設計模式:單例模式、工廠模式(抽象工廠模式)、觀察者模式、介面卡模式、迭代模式等等。本題選擇C觀察者模式。
13.請看一下這一段C++程式碼,如果編譯後程序在windows下執行,則一下說話正確的是(C)
char*p1 =“123456”;
char*p2 =(char*)malloc(10);
A. p1和p2都存在棧中
B. p2指向的10個位元組記憶體在棧中
C. 堆和棧在記憶體中的生長方向是相反的
D. “123456”這6個字元儲存在棧中
分析:
A. p1和p2如果放在函式體外,則存在全域性區,如果在函式體內則存在棧中。
B. p2指向的10個位元組記憶體在堆中。
C. 正確。
D. “123456”這6個字元儲存在常量區。
14.將3個球隨機放入4個杯子中,則杯子中球的最大個數為2的概率是(A)
A. 9/16 B. 3/4C. 3/8 D. 3/16
分析:
要求杯子中球的最大個數為2,也就是四個杯子中的球數目為2,1,0,0.所求概率是古典概型,總的事件為4^3,符合條件的總數為
C(2,3)*C(1,4)*C(1,3),所以P=C(2,3)*C(1,4)*C(1,3)/4^3 = 9/16.
15.對n個元素的陣列進行快速排序,所需要的額外空間為(A)
A. O(1)B. O(n)C. O(log(2n))D. O(n^2)
16.下面關於編譯器與直譯器的觀點,錯誤的是(D?)
A. 直譯器不產生目標程式,它直接執行源程式或者源程式的內部形式
B. 解釋程式和編譯程式的主要區別在於是否產生目標程式
C. 編譯器對高階語言程式的處理過程劃分成詞法分析、語法分析、語義分析,中間程式碼生成、程式碼優化、目的碼生成幾個階段
D. 直譯器參與執行控制、程式執行的速度快
17.假設系統中有5太裝置,有多個程序需要使用2個裝置,假定每個程序一次只能使用一臺,則至多允許多少個程序來競爭這5個資源,而不會發生死鎖(C)
A. 2 B. 3 C. 4D. 5
分析:
此題雖然在考試時選了C,但是並沒有把握,後然上網查了一下,確定應該就是C了。其實這題就是哲學家就餐問題,當5哥程序的時候如果同時申請到了1臺,就會發生死鎖;如果是4個程序,那必然有一個能申請到2臺。
18.下面哪些協議,存在源埠和目的埠是(BC)
A. IP B. TCP C. UDP D. ICMP協議
分析:源埠和目的埠是在傳輸層中用到的因此選BC。
19.下列哪些sql是等價的(AD?)
A. selectA.tname,A.depart from teacher A join course B on B.tno =A.tno
B. selectA.tname,A.depart from teacher A where A.tno=course.tno
C. selectA.tname,A.depart from teacher where tno in (select tno from course)
D. selectA.tname,A.depart from teacher where exsist (select * from course B where B.tno= A.tno);
分析:資料庫的SQL語句忘得差不多了,這個題也是蒙的。
20.某一磁碟請求序列(磁軌號):98、 183、37、122、14、124、 65、 67,按照先來先服務FCFS磁碟排程對磁碟進行請求服務,假設當前磁頭在53道上,則磁臂總移動道數為:(C)
A、169 B、208 C、640 D、236
21.將一個C類網路劃分為3個子網,每個子網最少要容納55臺主機,使用的子網掩碼是:(D)
A、255.255.255.248 B、255.255.255.224
C、255.255.255.224 D、255.255.255. 192
22下列關於計算機硬體的描述,正確的是:(D)
A、磁碟的平均存取時間指的是磁碟的尋道時間加上磁頭在某一磁軌等待記錄扇區的時間
B、計算機的控制器是由多種部件組成,其中包括,指令暫存器、程式計數器和算數邏輯單元
C、一臺計算機的字長是32位,表明該機器能處理的數值最多為4個位元組
D、系統匯流排可以分為資料匯流排、地址匯流排和控制匯流排三類
分析:
好吧,這題在考試時做錯了(多選了一個B)。後來上網查了一下計算器控制器的組成:指令暫存器InstructionRegister、指令譯碼器InstructionDecoder、定時與控制電路ProgrammableLogic Array、程式計數器ProgramCounter、標誌暫存器FlagsRegister、堆疊和堆疊指標Stack Pointer、暫存器組等構成。
23、假設有關係模式R(A,B,C,D),其資料依賴集:F={(A,B)->C,C->D},則關係模式R的規範化程度最高達到:(B) A.1NF B.2NF C.3NF D.BCNF
分析:
這個題考試時算是半猜半蒙的,回來翻了一下書看了一下關係模式的定義,應該選B。2NF:第二正規化。如果關係模式R為第一正規化,並且R中每一個非主屬性完全函式依賴於R的某個候選鍵,則稱R為第二正規化模式。(如果A是關係模式R的候選鍵的一個屬性,則稱A是R的主屬性,否則稱A是R的非主屬性。) 3NF:第三正規化。如果關係模式R是第二正規化,且每個非主屬性都不傳遞依賴於R的候選鍵,則稱R是第三正規化的模式。BCNF:BC模式。如果關係模式R是第一正規化,且每個屬性都不傳遞依賴於R的候選鍵,那麼稱R為BCNF的模式。
24.以下為一段瀏覽器中可執行的Javascript 程式碼,則執行該段Javascript程式碼的頁面彈出框中顯示的結果是:(D?)
var obj = {“key”:”1”,”value”:2}; var objNew = obj; objNew.value +=obj.key; alert(obj.value);
A、2 B、12 C、3 D、21
分析:本人對javascript不怎麼熟悉,因此這個題的答案不確定對不對。
25.有足夠量的2分、5分、1分硬幣,如果想湊齊一元錢,可以有(A)種方法 A、541 B、270 C、1024 D、128
分析:
設1分的硬幣有x,2分的硬幣有y,5分的硬幣有z。那麼x+2y+5z = 100,問題轉化為這個三元一次方程有多少整數解。下面給一種不規範的解法:
當z = 20, x = 0, 1個解
當z = 19, x = 1,3,5, 3個解
當z =18,x = 0,2,4,6,8,10, 6個解
當z = 17,x = 1,3,5,7,9,11,13,15, 11個解
…..
當z = 1,x = 1,3,5,7,…,95, 48個解
當z = 1, x = 0,2,4,6,….100, 51個解
可以發現每一行解個數類似一個等差數列,因此可以做等差數列求和來近似求解,(1+51)*21 / 2 = 546與選項中541比較接近所以選A,我在考試的時候就是用的這種方法,其他的求和沒有仔細想過,大家可以回去想想吧。
二、填空題(共5題,每題4分,共20分)
26、閱讀下面程式碼: #defineMAX_NUM 1000+1
int Temp =Max_NUM*10;
則Temp的值為( 1010)
分析:
注意巨集定義只是字串的替代,是在編譯之前完成的,在本題中替代後的程式碼為:int Temp =1000+1*10;因此編譯執行的時候結果是1010.這點提醒我們在使用巨集定義的時候加適當的括號很有必要。
27.某個單CPU作業系統搶佔式程序排程策略。現在有三個任務T1(優先順序高),T2(優先順序中),T3(優先順序低)同時進入排程佇列,每個任務都需要佔用CPU時間10ms, 等待I/O需要13ms,然後再用CPU時間5ms,則T3從進入排程對了到完成需要(54)ms(不考慮系統任務排程的開銷)
分析:
注意三個任務是同事進入排程佇列的!
排程過程順序如下:
1.CPU呼叫T1,執行10ms.
2.I/O處理T1 10ms,CPU同時排程T2,執行10ms
3.I/O處理T1 3ms,CPU同時排程T3,執行3ms
4.CPU呼叫T1 5ms,I/O處理T2 5ms,T1完成任務
5.I/O處理T2 7ms,CPU同時排程T3,執行7ms
6.I/O處理T2 1ms
7.CPU呼叫T2 5ms,I/O處理T3,執行5ms,T2完成任務
8.I/O處理T3 8ms
9.CPU排程T3執行5ms
總時間為10+10+3+5+7+1+5+8+5 = 54ms
28.在一個採用頁式虛擬儲存管理的系統中,有一使用者作業,它依次要訪問的也沒序列是1,2,3,4,1,2,5,1,2,3,4,5.假定分配給該作業的頁數為3且作業初始時未裝載頁面,那麼採用FIFO排程演算法產生的缺頁中斷數為(9),採用LRU排程演算法產生的缺頁中斷數為(10)
分析:
FIFO:
1.前三個作業,都發生缺頁,佇列:1,2,3
2.作業4進來,1被替換,缺頁,佇列:2,3,4
3.作業1進來,2被替換,缺頁,佇列:3,4,1
4.作業2進來,3被替換,缺頁,佇列:4,1,2
5.作業5進來,4被替換,缺頁,佇列:1,2,5
6.作業1進來,沒有缺頁,佇列:1,2,5
7.作業2進來,沒有缺頁,佇列:1,2,5
8.作業3進來,1被替換,缺頁,佇列:2,5,3
9.作業4進來,2被替換,缺頁,佇列:5,3,4
10.作業5進來,沒有缺頁,佇列:5,3,4
共發生缺頁9次。
LRU:
1.前三個作業,都發生缺頁,佇列:1,2,3
2.作業4進來,1被替換,缺頁,佇列:2,3,4
3.作業1進來,2被替換,缺頁,佇列:3,4,1
4.作業2進來,3被替換,缺頁,佇列:4,1,2
5.作業5進來,4被替換,缺頁,佇列:1,2,5
6.作業1進來,沒有缺頁,佇列:2,5,1
7.作業2進來,沒有缺頁,佇列:5,1,2
8.作業3進來,5被替換,缺頁,佇列:1,2,3
9.作業4進來,1被替換,缺頁,佇列:2,3,4
10.作業5進來,2被替換,缺頁,佇列:3,4,5
共發生缺頁10次。
29.#include <stdio.h>
class Base
{
public:
virtual int foo(int x){return x*10;}
int foo(char x[14]){returnsizeof(x)+10;}
};
classDerived:public Base
{
int foo(int x){return x*20;}
virtual int foo(char x[10]){return sizeof(x)+20;}
};
int main(void)
{
Derived stDerived;
Base * pstBase=& stDerived;
char x[10];
printf(“%d\n”,pstBase->foo(100)+pstBase->foo(x));
return 0;
}
在32位環境下,以上程式的輸出結果是(2014)
分析:
對於虛擬函式與多型,呼叫基類方法還是子類方法,我常用的方法是,
虛擬函式呼叫看右邊,非虛擬函式呼叫看左邊。在本題中foo(100)是虛擬函式(在基類中該方法名前有關鍵字virtual,在子類中只是省略了),所以看右邊,右邊是Derived型別,因此呼叫基類的子類。
foo(x)是非虛擬函式(基類該方法名前沒有virtual,所以不是虛擬函式),看左邊型別是Base型別,因此呼叫子類foo。
另外在本題中還需要注意一點,在執行int foo(charx[14]){return sizeof(x)+10;}時,x其實不是陣列型別,而是已經轉換為指標型別,因此sizeof(x)的結果是4.
題目答案為2014,貌似當時自己也做錯了~~~~。
附加題(共2題,不計入總分)
31.珠寶商甲需要去鑑定一批41克以下的寶石(可能是41克以下不包括41克的任意重量),他只能攜帶一個天平和四個砝碼去稱重,請問他會攜帶那些重量的砝碼?
分析:
標準答案是:1,3,9,27。我當時做的答案是:1,4,9,25,說明一下,如果需要稱量2克,需要2次,首先稱出比1克重,再稱出比3克輕,因為是整數克,所以就確定是2克,其餘的大家推一下,我推的時候是可以的,大夥看看我的答案對不對。
32.UTF-8是現在流行的編碼方式,下面是RFC2279對UTF-8編碼規則的規定,根據這個規則,中文字元‘我’的unicode值為0X6211,utf-8編碼之後為0XE68891。 請回答一下問題:
A)英文字元‘a’,其unicode的十六進位制值為0X61,則其UTF-8編碼後的十六進位制值為?
B)中文字元‘騰’,其unicode的十六進位制值為0X817E,則其UTF-8編碼後的十六進位制值為?
C)中文字元‘訊’,其unicode值經過UTF-8編碼之後為0XE8AEAF,則請問其unicode的十六進位制值是?
分析:
這裡對UTF-8的編碼不做介紹了,有興趣的同學可以上網找找資料,有好多關於UTF-8的資料。
答案是:A)0X61 B)0XE885BE C)0X8BAF