騰訊2013年實習生筆試題目(附答案)


下面是我在參加2013年騰訊實習生招聘的筆試題目,當然啦,我個人不可能是完全的記住所有題目,部分是摘自網絡的。同時,下面也有一些題目我不會的,希望大家一起商量解決給以答案,謝謝。

選擇題

32位機上根據下面的代碼,問哪些說法是正確的?()

    signed char a = 0xe0;
    unsigned int b = a;
    unsigned char c = a;

    A. a>0 && c>0 為真 
    B. a == c 為真 
    C. b 的十六進制表示是:0xffffffe0 
    D.上面都不對

答案:C

考點:有符號數和無符號數之間的轉換

解析:

  • 0xe0轉換成二進制是1110 0000,因為0xe0的最高位是1,所以作為有符號數的時候就是負數,作為無符號數的時候就是正數,因此A選項是錯的,同時B也是錯誤的。
  • 負數的高位用1補齊,正數的高位用0補齊,所以b(0xe0)的二進制表示形式是1111 1111 1111 1111 1111 1111 1110 0000,十六進制的表示形式是0xffffffe0

 

下面哪些選項能編譯通過?  
int i;
char a[10]; 
string f(); 
string g(string &str);  

A. if(!!i){f();} 
B. g(f()); 
C. a=a+1; 
D. g("abc"); 

答案:A

考點:C++的細節掌握。

解析:

  • A是肯定對的,因為他有一個默認值。
  • B選項是錯誤的。因為f() 返回的是一個臨時量,然后傳給 g 函數,而 g 的參數不是const 引用,是不能引用臨時量的。
  • C選項是錯誤的。因為a 是一個地址常量,不可能再被賦值。
  • D選項是錯誤的。因為"abc" 的類型可是 const char* 呢,是個常量指針(可以用來初始化 string)。(對這題我有點疑問,因為我不是學C++的,所以希望讀者看到可以幫我解答一下,謝謝)
int a[10]; 問下面哪些不可以表示 a[1] 的地址?

A. a+sizeof(int)
B. &a[0]+1
C. (int*)&a+1
D. (int*)((char*)&a+sizeof(int))

答案:A

考點:C++數組的指針表示形式的掌握

解析:

  • A. a+sizeof(int) 選項不正確,假設在32位機器上,sizeof(int)的值為4,而a+sizeof(int) 相當於指針運算 a + 4,也就是a[4]
  • B. &a[0]+1選項正確,因為 &a[0]的意思是取的數組首元素地址,而數組首元素地址加1(a + 1),根據指針運算就是a[1]的地址
  • C. (int*)&a+1選項正確,因為數組地址被強制類型轉換為int*,然后加1,這樣和B表示的一個意思
  • D.(int*)((char*)&a+sizeof(int))選項正確,因為數據地址先被轉換為char*,然后加4,根據指針運算公式,向前移動4 * sizeof(char),之后被轉換為int*,顯然是a[1]的地址

 

問下面的數據都存放在哪些存儲區?

int main()
{
    char *p = "hello,world";
    return 0;
}

A. 堆和靜態數據區
B. 棧和靜態數據區
C. 棧和常量區
D. 棧和堆

答案:C

解析:其實,在做這一題的時候,我是當成Java來做的,呵呵

  • 根據C語言中的特性和定義p是一個局部變量,而C語言中局部變量存在於棧中,"hello wrold"是一個字符串字面常量,因此存儲於程序的只讀存儲區中,p在這里其實只是指向了"hello wrold"在只讀存儲區中的地址而已

 

4)下面哪些說法正確?()
    A. 數組和鏈表都可以隨機訪問
    B. 數組的插入和刪除可以 O(1)
    C. 哈希表沒有辦法做范圍檢查
    D. 以上說法都不正確

答案:B

解析:

  • A選項是錯誤的,因為數組可以直接通過下標得到存儲的值 因此支持隨機;而訪問鏈表是鏈式存儲結構時無法支持隨機訪問,要訪問一個指定位置的元素必須從頭開始做指針移動
  • B選項是正確的,因為數組的插入如果位置在最后面的話可以為O(1),刪除的時候,直接通過下標指定要刪除哪個即可,所以也可以為O(1)
  • C選項是錯誤的,因為哈希表支持直接通過關鍵碼得到值 其實數組就是一種哈希表 下標就是關鍵碼 通過下標直接得到值 因此哈希表肯定需要做范圍檢查也有辦法做范圍檢查的
  • D選項是錯誤的,這個不用解釋啦,哈哈^_^

 

基於比較的排序的時間復雜度下限是多少?()
   A. O(n) 
   B. O(n^2) 
   C. O(nlogn) 
   D. O(1)

答案:C

解析:其實大家記住這個結論就好,在當前計算機科學界對於基於比較的排序最快只是O(n*logn),例如快速排序,堆排序,歸並排序

 

有兩個線程,最初 n=0,一個線程執行 n++; n++; 另一個執行 n+=2; 問,最后可能的 n 值?()

A. 1 
B. 2 
C. 3 
D. 4

答案:BCD

解析:大家要知道 C語言中的 ++ 和 += 並不是原子操作,而是通過多條微程序組成的,因此 ++ 和 += 在執行過程中可能被中斷的

  • 第一種可能情況:現在假設兩個線程沒有並行順序執行的那么結果顯然是 4。
  • 第二種可能情況:再假設現在第一個n++ 已經執行完了  但是結果還沒有寫回內存 這個時候 n+=2 已經全部執行完 2 寫進了內存 結束 然后回到n++的寫回操作 這個時候內存就從2被改回1了,后面再來一次n++  結果就為2。
  • 第三種可能情況: 第n+=2 先讀取n的值到寄存器 即0入寄存器 這個時候被中斷   第一個n++開始執行 並直到結束 內存被改成了1 ,然后 n+=2 繼續執行 結束后內存變為2  第二個n++再執行 結果就是3了
  • 我個人看了網上的這個解析后也覺得,肯定不可能為1了。

 

下面哪些函數調用必須進入內核才能完成?()
   A. fopen 
   B. exit 
   C. memcpy 
   D. strlen

答案: AB

解析:

  • fopen是打開文件的函數,文件也可以看成是一個設備,打開一個設備將導致給設備所屬的驅動程序發送一個IRP,而與真實硬件相關的驅動程序都運行於內核
  • exit函數是結束進程的函數,結束進程需要訪問PCB(進程控制塊)和TCB(線程控制塊)等等一些數據結構,而這些數據都存在於內核中
  • memcpy 和 strlen 我們可以直接不調用任意函數寫出來這種函數肯定不會實現在內核的
  • 關於memcpy函數,詳情可以查看百度百科的解釋(地址是:http://baike.baidu.com/view/736225.htm)

 

死鎖發生的必要條件?()

   A. 互斥條件 
   B. 請求和保持 
   C. 不可剝奪 
   D. 循環等待

答案:ABCD

考點:操作系統,剛剛學,好興奮這題當時做的,一秒鍾都不用瞬間選擇了【偷笑】

解析:互斥條件,請求和保持,不可剝奪 ,循環等待,這些都可能導致發生死鎖,所以以后大家在做多線程程序時一定要注意了。

 

內存管理中的 LRU 方法是用來管理什么的?()

A. 虛擬內存的分配 
B. 虛擬內存的釋放 
C. 物理內存的分配 
D. 物理內存的釋放

答案:AD

考點:操作系統

解析:今天下午認真看了下課本,溫故了下知識,關於這題,得出以下幾個解釋,詳細的我就不說啦,大家自己看書,我大概說下基本的。

1.頁面調入:是給頁面調入內存中,給它分配物理內存

2.頁面置換,就是將內存中的頁面置換出來,放到虛擬內存中,讓物理內存空閑出來,讓給需要使用的頁面。

3.LRU:全稱是:Least Recently Used(最近最久未使用)置換算法,所以這個算法涉及到了虛擬內存的分配和物理內存的釋放。所以答案是AD。

 

求N個數中的最大值和最小值,最小比較次數是多少?
A 4n/3
B 2n-2
C n-1
D 3n/2

答案:D

解析:在一本書上看過,利用分治思想,評論中有@LPopo提供的不用分治法實現的代碼,在九樓。在此表示感謝。

 

一棵二叉樹的先序遍歷是 f b a c d e g h,中序遍歷是 a b d c e f g h,問后序遍歷是什么

答案:adecbhgf

解析:根據先序遍歷和中序遍歷,我們可以構建一顆二叉樹:

 

在32位little endian機器上運行該程序,得到結果是什么?

#include <stdio.h>
int main()
{
    long long a = 1, b = 2, c = 3;
    printf("%d %d %d \n", a, b, c);
    return 0;
}

A.1 2 3
B 1 0 2
C ......  
D 3 2 1

答案:B

解析:因為long long 是8個字節的,%d是4個字節的,溢出覆蓋了后面,然后又是小端規則的。

【傳入參數,由右往左,棧空間內存從高往低,little endian, 棧空間如下:
內存高位->
00000000       00000011
00000000      [00000010](c)
[00000000](b) [00000001](a)
<-內存低位
因此printf會按照4bytes取參數. 】來自http://bbs.csdn.net/topics/390424969?page=1#post-394210570第33樓的回復

 

關於訪問,下面哪些是后台絕對不會執行的?

A. 本地查查 DNS,是否有 sinaapp.com 的 ip;
B. 通過 cn. 查找 ip;
C. 通過 com. 查找 ip;
D. 瀏覽器發送 http get 請求;
E. 服務器回送 xxx.jpg;

答案:。。。不會,我當時蒙的,好像選的是E。。。

解析:不會,自然解析不了。。。

 

高內聚和低耦合,下面哪個耦合度最高?
A. 通過函數參數傳遞...
B. 一個函數修改另外一個函數中的數據;
C. 通過全局變量...
D. 通過指示器...

答案:網上說答案是C,我也不是很清楚。。

解析:

  • 內聚就是一個模塊內各個元素彼此結合的緊密程度,高內聚就是一個模塊內各個元素彼此結合的緊密程度高。所謂高內聚是指一個軟件模塊是由相關性很強的代碼組成,只負責一項任務,也就是常說的單一責任原則。
  • 耦合:一個軟件結構內不同模塊之間互連程度的度量(耦合性也叫塊間聯系。指軟件系統結構中各模塊間相互聯系緊密程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性則越差,模塊間耦合的高低取決於模塊間接口的復雜性,調用的方式以及傳遞的信息。) 對於低耦合,粗淺的理解是:一個完整的系統,模塊與模塊之間,盡可能的使其獨立存在。也就是說,讓每個模塊,盡可能的獨立完成某個特定的子功能。模塊與模塊之間的接口,盡量的少而簡單。如果某兩個模塊間的關系比較復雜的話,最好首先考慮進一步的模塊划分。這樣有利於修改和組合.

 

TCP協議棧的定時器有哪些()
A....
B....
C....
D....

答案:忘記選項了,網上也找不到,大家知道有考這個知識點就好啦。。。

解析:百度了一下,TCP協議棧的定時器有延時定時器,重傳定時器,堅持定時器,保活定時器

 

網卡,交換機,路由器和UDP分別工作網絡的哪些層?

答案:依次是:物理層,鏈路層,傳輸層

填空題

在一個 big endian 的 32 位的計算機上,b 的結果是______

unsigned int a = 0x1234;
char b = *((char*)&a);

答案:0

解析:

unsigned int是 4 個字節,0x1234 的完整表示是 0x 00 00 12 34,因為是 big endian,所以,所以 &(取地址) 的話,如果當字節看的話,取到了最左邊 00 字節的地址,一定要轉換成 char 看的話,值就是 0。

 

一個有 800 個結點的完全二叉樹,問有_____個葉子結點?

答案:400

解析:畫圖舉例子很容易就可以推導出規律,通過這個公式即可計算得400

 

下面 get 是求一個二維數組元素的函數,請補全.

#include <stdio.h>
#include <stdlib.h>
#define M 3
#define N 4
 
int get(int *a, int i, int j)
{

   _______ // 此處一個空

} 
int main() 
{
    int a[M][N] = {{1,2,3,4},{5,6,7,8},{9,10,11,12}};
    int v; 
    v = get(a, 2, 1); 
    printf("a[2][1] == %d\n", v ); 
    return 0; 
}

 

答案:return *(a+i*N+j);

解析:大家注意原型中的指針是int* a,所以必須用二維數組在內存中是一維排布這個知識點來做,直接 return *(a+i*N+j);而不是 return *(*(a+i)+j);

補全插入排序:

#include <stdio.h>
#include <stdlib.h>
int insert_sort(int *p, int count)
{
    int i, j, tmp;
    if(p == NULL || count < 0) return 0;    //
    for(i=1; i<count; i++){
        tmp = p[i;
        j = i-1;
        while(__________){ // 此處一個空
            p[j+1] = p[j];
            --j;
        }
       ___________;   // 此處一個空
    }
    return 1;
}
int main()
{
    int i, a[10 = {3, 2, 1, 7, 8, 10, 4, 5, 6, 9};
    insert_sort(a, 10);
    for(i=0; i<10; i++)
        printf("%d ", a[i);
    printf("\n");
    return 0;
}

答案:第一個空: j>=0 && p[j>tmp  第二個空:p[j+1] = tmp;

解析:看看數據結構的課本就有啦,呵呵

 

使用 FIFO 管理頁面請求,如果分配的物理塊 M = 3 或是 4,請求順序如下:4 3 2 4 4 3 5 4 5 3 1 5 1 5 1 5 4,問兩種情況下頁面失效的次數各是________和__________?

答案:首先感謝@ LPopo的解答,答案是9和6,

考點:操作系統

解析:M=3時:一開始是空的,所以4,3,2都頁面失效。失效三次,然后4,4,3都有效,5失效一次,4先進來的所以先出去,變為3,2,5,然后4又失效一次,3出去,變為2,5,4,以此類推。就是先進來的先出去。最后加起來一共9次。M=4的也一樣。只是能多存一個頁。

 

軟件可靠性評估的兩個指標是___________和_____________?

 答案:不會。。。

 

參考網站:

Coding Life的專欄:http://blog.csdn.net/bobo823679351/article/details/8820813

lyj103862095的專欄 :http://blog.csdn.net/lwj103862095/article/details/8815967

百度文庫:http://wenku.baidu.com/view/f709ac3da32d7375a4178036.html

 

 


免責聲明!

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



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