騰訊2013年實習生筆試題目

一、選擇題

1、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.上面都不對

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

解析:

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

2、下面哪些選項能編譯通過()?

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");

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

解析:

  • A是肯定對的,因爲他有一個默認值。
  • B選項是錯誤的。因爲f() 返回的是一個臨時量,然後傳給 g 函數,而 g 的參數不是const 引用,是不能引用臨時量的。
  • C選項是錯誤的。因爲a 是一個地址常量,不可能再被賦值。
  • D選項是錯誤的。因爲"abc" 的類型可是 const char* 呢,是個常量指針(可以用來初始化 string)。

3、int a[10]; 問下面哪些不可以表示 a[1] 的地址?

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

考點: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]的地址

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

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

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

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

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

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

解析:

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

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

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

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

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

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

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

8、下面哪些函數調用必須進入內核才能完成?()

A. fopen
   B. exit
   C. memcpy
   D. strlen

解析:

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

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

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

考點:操作系統

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

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

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

考點:操作系統

解析:大家自己看書,我大概說下基本的。

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

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

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

11、求N個數中的最大值和最小值,最小比較次數是多少?

A 4n/3
B 2n-2
C n-1
D 3n/2

分析:解析:在編程之美上看過,利用分治思想

 12、一棵二叉樹的先序遍歷是 f b a c d e g h,中序遍歷是 a b d c e f g h,問後序遍歷是什麼

答案:adecbhgf

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

13、在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

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

【傳入參數,由右往左,棧空間內存從高往低,little endian, 棧空間如下:
內存高位->
00000000       00000011
00000000      [00000010](c)
[00000000](b) [00000001](a)
<-內存低位

14、關於訪問,下面哪些是後臺絕對不會執行的?

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

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

解析:

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

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

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

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

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

二、填空題

1、在一個 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。

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

答案:400

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

3、下面 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);

4、補全插入排序:

複製代碼
#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;

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

答案是9和6,

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

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

答案:無錯運行概率,平均故障時間

發佈了43 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章