1. 程式人生 > >百度C++面試題

百度C++面試題

2012年10月18號百度PC客戶端崗位一面電話面試面試題:

前奏:因為阿里巴巴的面試不能由大連調北京,我就風塵撲撲的從北京回到大連去面阿里巴巴,儘管知道在就業形勢很不好的今年進阿里巴巴的機會很渺茫,但是還是想試一把,所以就回去了,正好在回去的時候收到的百度的面試,由於不在北京,就電話面了,其實在會大連之前筆試百度過之後,就知道肯定會有面試

2012年10月22號百度客戶端二面面試題:

1、select函式的介紹

(1)一些小的知識點比如 select() 函式中第一個引數 int maxfdp 為什麼要是最大的檔案描述符的值 +1 ,當時臨陣磨槍的看了下select函式,細緻的知識點答不上來,參考

http://blog.csdn.net/leo115/article/details/8097143

2、C++中一個類的大小如何確定?

這個以前沒看過,就是分析了一下,結果露出了自己對虛擬函式理解的嚴重錯誤的馬腳,接下來分析一下C++中類的大小:

(1)在一個C++類中,如果什麼都沒有,則這個類只佔有1個位元組;說明:如果一個類中沒有任何資料成員,則這個類實際上是不佔用儲存空間的,size = 0;但是0不好在記憶體中定義一個地址,所以我們就人為的規定了大小為0的一個物件所佔的儲存空間的大小為1。

(2)一旦這個類中有其他的一些資料成員,比如說一個 int data ;那麼這個類的大小就為 4 個位元組,而不是5個位元組,上述的一個位元組不計算在內;

(3)普通的成員函式是不佔用空間的,所以一個只用普通函式的類的大小隻佔有 1 個位元組。說明:普通成員函式是類的所有物件所通用的方法,不算做物件的成員,所以不能算在物件的儲存空間內。

(4)對於有虛擬函式的類,因為要存在一個虛擬函式表,需要4個位元組,(是一個數組指標vptr,陣列中儲存的是虛擬函式的函式指標的地址),這個指向虛擬函式表的指標佔用4個位元組的儲存空間。

(5)注意將資料對齊考慮進去,如一個類中含有 虛擬函式 和  一個char型資料,sizeof(class) = 8 ;預設對齊是 4位元組對齊。

3、聊了一下虛擬函式機制,虛擬函式表這一塊理解的粗枝大葉,答得很狼狽:

(2)這個虛擬函式表是所有的類的例項都共用這個虛擬函式表呢?還是每個例項都會有一個虛擬函式表的copy版本?

4、Linux下的一個檔案 /proc 這個目錄是存放什麼的?如何檢視當前跑的程序的最大數量?如果檢視當前所開啟的檔案的數量?如何檢視當前所建立的連線?統計當前建立的連線的數量?

我在Linux環境下週遊了一年多的時間,感覺對這個平臺還算很熟悉吧,但是對於面試官提出的幾個命令,表示都沒有接觸過,再者就是忘了, 再者就是完全沒用到,對於第一個命令,這個目錄是是linux下的一個偽檔案系統,裡邊儲存一些與 程序相關的,系統相關的,以及系統子系統部分,可以直接通過cat / echo 直接輸出一些使用者需要的核心資訊。平時在做多執行緒程式設計的時候更多的呼叫繼承開發環境自帶的庫函式,可能是自己所操作的執行緒比較少 或者是 平時做的專案的深度確實沒達到,都是一些淺層面的操作,導致自己根本沒有掌握這麼多知識,只的表示不會。

5、程序和執行緒之間的區別?什麼是“執行緒安全”?

簡單的介紹:程序是動態執行的程式的例項,作業系統分配資源的基本單位,每一個程序都是一個實體,都有自己的地址空間,(包括:文字區域,資料區域,堆疊),程序是執行中的程式。執行緒是 程序中某單一順序的控制流,也被稱為輕量級程序,是執行中的程式的排程的基本單位,說明:單一順序的控制流,每個獨立的執行緒都有一個程式的入口、執行佇列和程式的出口。但是執行緒不能獨立的執行,必須存在應用程式中,由應用程式提供多個執行緒執行控制。

(0)一個程式至少擁有一個程序(通過fork建立程序),一個程序至少擁有一個執行緒(必有一個主執行緒)。

(1) 從排程方面考慮,執行緒是作為排程和分配的基本單位,程序是作為擁有資源的基本單位,執行緒是CPU和記憶體的真正的使用者

(2)併發性方面考慮:不僅相同程序中的執行緒可以併發,不同程序中執行緒之間也是可以併發的;同時程序與程序之間也是可以併發的

(3)擁有資源:程序擁有自己獨立的地址空間,而執行緒不擁有系統資源,但是可以訪問所在的程序的資源。

(4)系統開銷方面:在建立和撤銷程序時,由於系統都要為之分配和回收資源,導致系統的開銷明顯大於建立和撤銷執行緒時的開銷。

接著解釋第二個問題 什麼是“執行緒安全”?

(1)如果程式程式碼所在的程序中有多個執行緒在同時執行,這些執行緒可能會同時執行這段程式碼,如果每次執行的結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的一樣,就是執行緒安全的。

(2)或者說:一個類或者程式所提供的介面對於執行緒來說是原子操作或者多個執行緒之間的切換不會導致該介面執行的結果產生二義性,也就是說我們不用考慮同步問題,這個時候執行緒是安全的。

(3)執行緒安全問題往往是由全域性變數及靜態變數引起的。

(4)一般來說若每個執行緒中對全域性變數、靜態變數只有讀操作,而無寫操作,一般來說,這個全域性變數的執行緒是安全的;若有多個執行緒同時執行寫操作,一般要考慮執行緒同步問題,執行緒同步的解決辦法一般是:臨界區、訊號量、互斥鎖等

6、最後問了一道演算法題:

有兩個字串陣列: string src[]  和 string des[] ,每個字串陣列的長度都是10W跳左右,每個字元的 size<1KB ,設計一個演算法 查詢 兩個字串陣列中想交的字串。

解析方法:

分析 10W = 2^20  1KB*10W*2 = 2GB ,當今的記憶體中正好可以容下這麼多資料,演算法設計

(1)遍歷字串陣列src,構造一個 tire tree(字典數),然後遍歷字串陣列des遇到已經儲存過的相同的結構則輸出。

(2)設計一個hash,關鍵是雜湊演算法的設計,因為這是一個字串陣列,每個字元都是有範圍的(0~25),我們可以字串陣列中的每個字串看成一個26進位制的數,將其轉化為10進位制,這樣就可以得到一個唯一的key值,對於字串太長的情況下,我們可以將這個字串對10萬取模,對10萬取模後,我們並不能保證這個key唯一,這樣我們就需要key值衝突處理,參考以下四種處理方式:http://blog.csdn.net/leo115/article/details/8052353

說明:同樣可以直接使用string型別的字串作為 hash key,每個string的ASCII碼是不同的,所以具有唯一性,故可以直接作為 hash key。

11月3號青牛軟體面試

青牛軟體的一面就是聊專案,沒有做題,然後遇到下面的一個問題:

1、作業系統中 什麼是臨界區?什麼是臨界資源? 舉例說明!

答:作業系統中對臨界區的定義是這樣的:每個程序中訪問臨界資源的那段程式稱為臨界區。臨界資源的定義是:臨界資源可以由多個程序所共享,但是一次僅能由一個程序訪問的共享資源。  臨界區要求每次只准許一個程序進入臨界區,佔時擁有臨界資源;

臨界資源的舉例:印表機,磁碟等, 一個全域性變數可以允許多個程序訪問,所以全域性變數不是臨界資源。

2013年3月份百度面試題模擬

概率問題:

1、給你一個長度為N的連結串列。N很大,但你不知道N有多大。你的任務是從這N個元素中隨機選取K個元素,連結串列要求只能遍歷一次,並且提出的演算法必須保證取到的每次資料都是按隨機概率取到的。

答: 要求: 1、連結串列長度不定  為 n ,2、按隨機概率取每個資料,或者說,取到的每個資料的概率為 隨機概率 K/N ;3、連結串列只能遍歷一次,所以這就不能通過遍歷獲取連結串列的長度在計算取到

演算法: 先選中前 k 個數據, 然後從 第 k+1 個元素到最後一個元素,每個元素按 k/i(i=k+1 、K+2 、 K+3.....N)的概率選中,然後與選中的k個元素實現交換,如此知道最後,選中的這K的資料,即為按隨機概率選中的資料。

證明: 最後一個被選中的概率 k/N ;倒數第二個被選中的概率 : (k/N-1)*(1-( (k/N)*(1/k) )) = k/N  ,選中第N-1個,並與最終陣列中的其中的一個交換(選中,並排座)。依次類推 ......每個節點選中的概率都為 k/N

2、一個數組的長度為n,從這個陣列中隨機選擇一個元素?

演算法: 先選中第一個,然後從第二個到最後一個按概率,,1/i (i=2,3,4,.....n)  來選中,跟結果集中的一個元素交換,依次類推,最後每個元素被選中的概率都為 1/n;

證明如上題:最後一個元素 被選中的概率為 1/n, 倒數第二個被選中的概率為: (1/n-1)*(1-1/n) = 1/n 

3、給定一個數組 A[1....N] ,如何快速建立一個數組B[1...N],時間複雜度要求在 O(n);A[1....N]  -> B[1....N]的規則如下:

B[i] = A[1]*A[2]....A[N]/A[i]; 要求不使用除法

演算法: 兩次掃描陣列 , 一次從前往後掃描,一次從後往前掃描

一次掃描: 從前往後

P[1] = 1;

P[i] = P[i-1] * A[i-1];

........ i>=2 && i=<N

二次掃描: 從後往前

Q[N] = 1;

Q[i] = Q[i+1] * A[i+1];

.....

( i>=1 i < N )

B[i] = P[i] + Q[i];

  1. #include <iostream>
  2. usingnamespace std;  
  3. int A[5] = {1,2,3,4,5};  
  4. int B[5],P[5],Q[5] ;  
  5. int main()  
  6. {  
  7.     int i=1;  
  8.     int j=3;  
  9.     P[0] = 1;  
  10.     Q[4] = 1;  
  11.     for(;i<5&&j>=0;i++,j--)  
  12.     {  
  13.         P[i] = P[i-1]*A[i-1];  
  14.         Q[j] = Q[j+1]*A[j+1];  
  15.     }  
  16.     for(i=0;i<5;i++)  
  17.     {  
  18.         B[i] = P[i]*Q[i];  
  19.         cout<<B[i]<<"  ";  
  20.     }  
  21.     cout<<endl;  
  22.     return 0;  
  23. }  

多執行緒程式設計的優點?

(1) 響應度高;比如說一個互動式的程式,比如說QQ視訊聊天時,視訊傳輸很明顯是耗時的,而且很多時候都會出現視訊卡的現象,這個時候假如說我們採用多線程式設計,當一個視訊阻塞的時候,當前這個程式仍能執行,我們仍然通過另外一些執行緒可以 打字,語音等。

(2) 資源共享,執行緒預設共享當前程序內的記憶體和資源。這種共享的優點是 允許同一程序,同一地址空間 存在多個執行緒

(3)經濟,系統開銷小;建立程序是要系統分配資源的,回收程序是要回收資源的,這個過程比較耗時,而建立執行緒則相對來說快速的多。

(4)充分利用處理器資源;現在的處理器一般為多核的,當有多個執行緒的時候,同一時刻,每個核都能在工作,並行的工作;但是假如說的單執行緒的話,只能執行在一個核上,相對來說,另外一個核就浪費了,所以使用多執行緒能充分利用CPU的資源,加快程式執行的速率。

程序中都有什麼?

在作業系統中,程序是由一個程序控制塊來管理 和 存放程序的一些資訊的,每個程序均有一個程序控制塊,在程序建立的時候,建立一個程序控制塊,並伴隨著程序執行的全過程,知道程序撤銷回收。 不同的作業系統 Linux / Window 中程序控制塊內的資訊基本上是一樣的: (1) 程序ID,唯一標識一個程序 (2)程序狀態 status ,程序是動態的,有五種狀態 : 開始 就緒 執行 阻塞 終止 (3)程式程式碼段 (4)資料段 (5)程序的資源清單  。 程序用於的I/O 檔案等 (6)程序優先順序 (7)程序同步 與 通訊的方式 (8)家族關係, 父程序 子程序

(9)CPU現場

為了程序控制塊的管理,常將程序控制塊組織起來,組織方式有兩種: 鏈式 和 索引式 ,便於查詢和管理


C++中指標與引用的區別:

相同點: 指標和引用都是地址的概念, 指標指向一塊記憶體,他的值是這塊記憶體的地址;而引用是一塊記憶體的別名。

區別:

(1)指標是一個實體,而引用只是一個別名,是指向的一塊記憶體的別名;

(2)引用只能被定義一次,“從一而終”,指標可以多次賦值

(3)引用沒有const,指標有const (常量) ;(int const &a 沒有意義,但是 const int &a 是有意義的;int const &a 指的是引用的值不可以改變,引用的值本身是不可以改變的,所以這樣修飾是無意義的)

(4)引用不能為空,指標可以為空;指標需要做非空檢查

(5)對sizeof()操作符, 引用的結果是 引用所指向的變數的型別大小,而指標是指的指標型別的大小

(6)對於++的意義不一樣

2012年12月4號 面試 ca technologies 面試題彙總

演算法題:

1、兩個連結串列是否有交點,並找出交點的起點。

2、兩個以排序好的陣列,找出其中相同的元素,並輸出

3、大數相加,注意 char型 到 int型資料的轉換

4、二叉樹的左右孩子交換

語言方面

1、編譯語言與指令碼語言的區別

資料庫方面

1、正規化 事務

思維題:
微軟 探頭題

一道有趣的二分查詢

:有兩個陣列,陣列的長度都為n,要求找出這兩個陣列中第n大小的元素,要求時間複雜度在 logn 級別。

二叉樹方面一道有意思的面試題:

1、判斷兩個二叉樹是否相似(結構類似),是否相同 (value)也一致。

豌豆莢面經連結:

AWK面試題總結:

awk 以其簡單易用,功能強大而備受日誌處理人員的青睞,掌握幾條awk語法與命令會讓我們的工作輕鬆很多

1、美團面試題,寫一個awk命令,提取出一個日誌檔案中的某一列並去重!

-F '[]' 設定分隔符   使用uniq命令之前,必須排序

  1. awk -F'[,]''{print $1}' uniqFile.txt| sort | uniq  

2、百度面試題,有兩個日誌檔案,每個檔案中有兩列,第一列為ID,第二列為字串,比較兩個檔案,並輸出具有相同ID的行:

 NR表示讀入的行數,FNR表示記錄在當前檔案中的行數,

  1. awk -F'[ ]''NR==FNR{a[$1]} NR>FNR{if($1 in a) print $0}' file1.log file2.log > c.txt  
  1. awk -F '[ ]''NR==FNR{A[i++]=$1;B[j++]=$0} NR>FNR {for(ia=0;ia<i;ia++) {if($1==A[ia]) {print $0;print B[ia]}}}' file1.log file2.log  

上述是對首先分析的檔案中的資料做一個記錄,然後,處理下一個檔案,如果對每一行資料進行判斷,看是否出現在file1中,如果是則輸出ID相等的兩列。

注:' ' 單引號是為了防止被shell命令解釋, 如果命令要換行的話,要用 \  反斜槓隔開