1. 程式人生 > >【程式設計師面試題2016】騰訊企鵝

【程式設計師面試題2016】騰訊企鵝

1、已知一棵二叉樹,如果先序遍歷的節點順序是: ADCEFGHB ,中序遍歷是: CDFEGHAB ,則後序遍歷結果為:( )

A. CFHGEBDA
B. CDFEGHBA
C. FGHCDEBA
D. CFHGEDBA

知識點

對於二叉樹的遍歷方式一般分為三種先序、中序、後序三種方式:

  • 先序遍歷(根左右)
    若二叉樹為空,則不進行任何操作:否則
    1、訪問根結點。
    2、先序方式遍歷左子樹。
    3、先序遍歷右子樹。
  • 中序遍歷 (左根右)
    若二叉樹為空,則不進行任何操作:否則
    1、中序遍歷左子樹。
    2、訪問根結點。
    3、中序遍歷右子樹。
  • 後序遍歷 (左右根)
    若二叉樹為空,則不進行任何操作:否則
    1、後序遍歷左子樹。
    2、後序遍歷右子樹。
    3、放問根結點。

因此,根據題目給出的先序遍歷和中序遍歷,可以畫出二叉樹:

二叉樹遍歷.png

最後結果選擇: D

2、下列哪兩個資料結構,同時具有較高的查詢和刪除效能?( )

A. 有序陣列
B. 有序連結串列
C. AVL 樹
D. Hash 表

知識點

幾種常見的資料結構操作效能.png

平衡二叉樹的查詢,插入和刪除效能都是 O(logN) ,其中查詢和刪除效能較好;雜湊表的查詢、插入和刪除效能都是 O(1) ,都是最好的。所以最後的結果選擇: CD

3、下列排序演算法中,哪些時間複雜度不會超過 nlogn?( )

A. 快速排序
B. 堆排序
C. 歸併排序
D. 氣泡排序

知識點

幾種常見的排序演算法對比.png

根據上圖,觀察平均情況,最好最差情況的時間複雜度基本可以知道答案了,最後結果選擇: BC

4、初始序列為 1 8 6 2 5 4 7 3 一組數採用堆排序,當建堆(小根堆)完畢時,堆所對應的二叉樹中序遍歷序列為:( )

A. 8 3 2 5 1 6 4 7
B. 3 2 8 5 1 4 6 7
C. 3 8 2 5 1 6 7 4
D. 8 2 3 5 1 4 7 6

初始化序列:1 8 6 2 5 4 7 3,,小根堆就是要求結點的值小於其左右孩子結點的值,左右孩子的大小沒有關係,那麼小根堆排序之後為:1 2 4 3 5 6 7 8;

中序遍歷:左根右,故遍歷結果為:8 3 2 5 1 6 4 7

故最後選擇的結果: A

5、當 n = 5 時,下列函式的返回值是:( )

123456[cpp]view plaincopyintfoo(intn){if(n<2)returnn;returnfoo(n-1)+foo(n-2);}

A.5
B.7
C.8
D.1

這題只需把數代進去,就可以知道結果了,所以最後結果選: A

遞迴.png

6、 S 市 A ,B 共有兩個區,人口比例為 3:5 ,據歷史統計 A 區的犯罪率為 0.01% ,B 區為 0.015% ,現有一起新案件發生在 S 市,那麼案件發生在 A 區的可能性有多大?( )

A.37.5%
B.32.5%
C.28.6%
D.26.1%

這道題首先得了解犯罪率是什麼?犯罪率就是犯罪人數與總人口數的比。因此可以直接得出公式:( 3 0.01% ) / ( 3 0.01% + 5 * 0.015% ) = 28.6%

當然如果不好理解的話,我們可以例項化,比如 B 區假設 5000 人,A 區 3000 人,A 區的犯罪率為 0.01%,那麼 A 區犯罪人數為 30 人,B 區的犯罪率為 0.015% ,那麼 B 區的犯罪人數為 75 人 ,求發生在 A 區的可能性,就是說 A 區的犯罪人數在總犯罪人數的多少,也就是 30/(30+75)=0.2857

當然,也可以迴歸到我們高中遺忘的知識:

假設C表示犯案屬性
在A區犯案概率:P(C|A)=0.01%
在B區犯案概率:P(C|B)=0.015%
在A區概率:P(A)=3/8
在B區概率:P(B)=5/8
犯案概率:P(C)=(3/80.01%+5/80.015%)
根據貝葉斯公式:P(A|C) = P(A,C) / P(C) = [P(C|A) P(A)] / [ P(C|A) P(A)+ P(C|B) P(B) ] 也可以算出答案來

故,最後結果選擇為: C

7、Unix系統中,哪些可以用於程序間的通訊?( )

A.Socket
B.共享記憶體
C.訊息佇列
D.訊號量

知識點

  1. 管道(Pipe)及有名管道(named pipe):管道可用於具有親緣關係程序間的通訊,有名管道克服了管道沒有名字的限制,因此,除具有管道所具有的功能外,它還允許無親緣關係程序間的通訊;
  2. 訊號(Signal):訊號是比較複雜的通訊方式,用於通知接受程序有某種事件發生,除了用於程序間通訊外,程序還可以傳送訊號給程序本身;linux除了支援Unix早期訊號語義函式sigal外,還支援語義符合Posix.1標準的訊號函式sigaction(實際上,該函式是基於BSD的,BSD為了實現可靠訊號機制,又能夠統一對外介面,用sigaction函式重新實現了signal函式);
  3. 報文(Message)佇列(訊息佇列):訊息佇列是訊息的連結表,包括Posix訊息佇列system V訊息佇列。有足夠許可權的程序可以向佇列中新增訊息,被賦予讀許可權的程序則可以讀走佇列中的訊息。訊息佇列克服了訊號承載資訊量少,管道只能承載無格式位元組流以及緩衝區大小受限等缺點。
  4. 共享記憶體:使得多個程序可以訪問同一塊記憶體空間,是最快的可用IPC形式。是針對其他通訊機制執行效率較低而設計的。往往與其它通訊機制,如訊號量結合使用,來達到程序間的同步及互斥。
    訊號量(semaphore):主要作為程序間以及同一程序不同執行緒之間的同步手段。
  5. 套介面(Socket):更為一般的程序間通訊機制,可用於不同機器之間的程序間通訊。起初是由Unix系統的BSD分支開發出來的,但現在一般可以移植到其它類Unix系統上:Linux和System V的變種都支援套接字。

故最後選擇的結果為: ABCD

8、靜態變數通常儲存在程序哪個區?( )

A.棧區
B.堆區
C.全域性區
D.程式碼區

靜態變數的修飾關鍵字:static,又稱靜態全域性變數。故最後選擇的結果為: C

9、查詢效能( )

A. 在Name欄位上新增主鍵
B. 在Name欄位上新增索引
C. 在Age欄位上新增主鍵
D. 在Age欄位上新增索引

結果選: B

10、IP地址131.153.12.71是一個(B)類IP地址。

A.A
B.B
C.C
D.D

知識點

IP地址分類.png

故將 131 轉為二進位制 :10000011,因此為 B 類 IP 地址,結果選 B

11、下推自動識別機的語言是:(C)

A.0型語言
B.1型語言
C.2型語言
D.3型語言

知識點

這是有關編譯原理的。

喬姆斯基體系是電腦科學中刻畫形式文法表達能力的一個分類譜系,是由諾姆·喬姆斯基於1956年提出的。它包括四個層次:

  • 0-型文法(無限制文法或短語結構文法)包括所有的文法。該型別的文法能夠產生所有可被圖靈機識別的語言。可被圖靈機識別的語言是指能夠使圖靈機停機的字串,這類語言又被稱為遞迴可列舉語言。注意遞迴可列舉語言與遞迴語言的區別,後者是前者的一個真子集,是能夠被一個總停機的圖靈機判定的語言。
  • 1-型文法(上下文相關文法)生成上下文相關語言。這種文法的產生式規則取如 αAβ -> αγβ 一樣的形式。這裡的A 是非終結符號,而 α, β 和 γ 是包含非終結符號與終結符號的字串;α, β 可以是空串,但 γ 必須不能是空串;這種文法也可以包含規則 S->ε ,但此時文法的任何產生式規則都不能在右側包含 S 。這種文法規定的語言可以被線性有界非確定圖靈機接受。
  • 2-型文法(上下文無關文法)生成上下文無關語言。這種文法的產生式規則取如 A -> γ 一樣的形式。這裡的A 是非終結符號,γ 是包含非終結符號與終結符號的字串。這種文法規定的語言可以被非確定下推自動機接受。上下文無關語言為大多數程式設計語言的語法提供了理論基礎。
  • 3-型文法(正規文法)生成正規語言。這種文法要求產生式的左側只能包含一個非終結符號,產生式的右側只能是空串、一個終結符號或者一個非終結符號後隨一個終結符號;如果所有產生式的右側都不含初始符號 S ,規則 S -> ε 也允許出現。這種文法規定的語言可以被有限狀態自動機接受,也可以通過正則表示式來獲得。正規語言通常用來定義檢索模式或者程式設計語言中的詞法結構。

正規語言類包含於上下文無關語言類,上下文無關語言類包含於上下文相關語言類,上下文相關語言類包含於遞迴可列舉語言類。這裡的包含都是集合的真包含關係,也就是說:存在遞迴可列舉語言不屬於上下文相關語言類,存在上下文相關語言不屬於上下文無關語言類,存在上下文無關語言不屬於正規語言類。

四種類型的文法的主要特點:

四種類型的文法的主要特點.png

因此答案選擇:B

12、下列程式的輸出是:( )

1 2 3 4 5 6 7 [cpp]viewplaincopy #define add(a+b) a+b   intmain() { printf(%dn”,5*add(3+4)); return; }

A.23
B.35
C.16
D.19

結果選擇 D