1. 程式人生 > >【面試】-百度外賣後端開發工程師

【面試】-百度外賣後端開發工程師

今天去奎科大廈參加百度外賣舉行的小型招聘會。因為百度外賣要拆分成百度的一個子公司,因此今年單獨舉行了一個小型的招聘會。大致流程如下:9:00-10:20筆試,10:20-11:00百度外賣CTO簡單宣講,11:00-13:00面試。

首先是筆試,筆試題比較基礎。十道選擇題,三道程式設計題和一道附加題。選擇題都是比較基礎的知識,有C++,演算法,邏輯題等等。程式設計題如下:

1.求一個月內百度外賣訂單銷量最多的前100名商戶。

解析:這道題可以用變形的堆排序。一種思路是用最大堆來做:先把整個陣列建最大堆,然後每次取出堆頂的元素,再重新調整堆,直到取完前100個最大數為止。另一種思路是用最小堆來做:取前100個數來建最小堆,然後遍歷剩下的所有元素,讓元素與堆頂元素比較,如果比堆頂元素大,則把該元素置換到堆頂,重新調整堆,最後剩下的100個元素即為最大的100個元素。程式碼就不貼了,關於堆排序的原理和程式碼可以參考我寫的這篇部落格:

http://blog.csdn.net/kevin_zhai/article/details/48029723

2.寫二分查詢演算法。

3.一個連結串列,除了有next指標外,還有一個指向任意節點的random指標,對該連結串列進行深拷貝。

由於時間關係,最後一道附件題沒做,面試的時候從面試官那看到我的卷子,給了70分。我覺得對於我這水平來說已經不錯了。筆試完了就是CTO宣講,之後就是面試了。一面的面試官問的問題都是C++基礎相關的問題和演算法,整理如下:

1.C++中虛擬函式的用法和原理

虛擬函式是用來實現多型的,當一個基類函式宣告為虛擬函式後,指向基類的指標在操作它的多型類物件時,會根據不同的類物件,呼叫其相應的函式。虛擬函式使用虛擬函式表來實現的。

2.C++中記憶體分配的方式

1)棧區(stack): 由編譯器自動分配釋放 ,存放函式引數值,區域性變數值等。其操作方式類似於資料結構中棧。

2)堆區(heap): 動態分配記憶體,用new/malloc時開闢,delete/free事釋放。

3)全域性區(靜態區)(static)—,全域性變數和靜態變數儲存是放在一塊,初始化全域性變數和靜態變數在一塊區域,程式結束後由系統釋放。

3.new/delete和malloc/free的區別

Malloc()與 free()是C語言的標準庫函式, new/delete 是C++的運算子, 他們都可以用來申請和釋放記憶體, malloc()和free()不在編譯器控制權限之內,不能把建構函式和解構函式的任務強加給他們。

4.怎樣檢測記憶體洩露

這個實在是不會。看到網上給的一種方法:每當申請一塊記憶體後,把指向它的指標加入到List中,當釋放時,再把對應的指標從List中刪除,到程式最後檢查List就可以知道有沒有記憶體洩露了。

5.string int_to_string(int id)這樣定義函式有什麼不好的地方

這個實在是不知道怎麼考慮,後來面試官給我講解這個問題。定義函式時最好不要直接返回string型別,而是把string用引用傳遞的方法,作為一個引數傳進來,返回的時候返回一個bool值,判斷是否執行成功。這樣比較好處理函式中發生的異常。

6.有兩個字串a和b,如果a中的字元在b中出現,則把該字元在a中刪除,返回剩餘a的字串。比如a為”xcvf”,b為”dfgh”,則返回”xcv”。

我是用map做的,程式碼如下:

char* deleteChar(char a[],char b[])
{
	map<char,int> chMap;
	char *result=a;
	int j=0;
	for(int i=0;b[i]!='\0';i++)
	{
		chMap[b[i]]=1;
	}
	for(int i=0;a[i]!='\0';i++)
	{
		if(chMap.find(a[i])==chMap.end())
		{
			result[j]=a[i];
			j++;
		}
	}
	result[j]='\0';
	return result;
}

7.求陣列中連續子陣列的最大和。

這是一道特別經典的線性規劃的題目,也是leetcode上的原題。下面這篇部落格詳細的講解了線性規劃的解題方法,以及這道題的思路和程式碼實現,大家可以參考:http://blog.csdn.net/kevin_zhai/article/details/48376377

8.有10個外賣騎士和100份訂單,設計一個排程系統,能夠合理的給騎士分配訂單。

這是一道開放題目,盡情發揮即可。

因為我C++和演算法掌握的比較好,一面感覺還是比較簡單的,不過第4題和第5題還是沒答上來。順利的通過一面後,接下來就是二面了。因為一面問了很多演算法和C++,二面面試官主要問了其他一些知識,資料庫,計算機網路,Linux等等。這些都是我的弱項,尤其是資料庫和計算機網路,都不知多少年沒複習過了。雖然題目應該都不算難,但直接被虐哭。。。。大致題目如下:

1.post和get的區別

以下是百度知道給的答案,僅供參考:

(1)get是從伺服器上獲取資料,post是向伺服器傳送資料。

(2)get是把引數資料佇列加到提交表單的ACTION屬性所指的URL中,值和表單內各個欄位一一對應,在URL中可以看到。post是通過HTTP post機制,將表單內各個欄位與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。使用者看不到這個過程。

(3)對於get方式,伺服器端用Request.QueryString獲取變數的值,對於post方式,伺服器端用Request.Form獲取提交的資料。

(4)get傳送的資料量較小,不能大於2KB。post傳送的資料量較大,一般被預設為不受限制。但理論上,IIS4中最大量為80KB,IIS5中為100KB。

(5)get安全性非常低,post安全性較高。但是執行效率卻比Post方法好。

2.tcp協議和http協議的區別

網上答案:httpd 是一個叫超文字協議的高層協議,而TCP、IP協議集,包過許多的子協議。 包括:傳輸層的FTPUDPTCP協議等,網路層的IP協含義等,高層協議如HTTP,TELNET協議等,HTTPTCP、IP的一個子協議。

3.tcp建立連線的過程

(1)客戶 端傳送一個帶SYN標誌的TCP報文到伺服器。這是三次握手過程中的報文1。

(2) 伺服器端迴應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ACK標誌和SYN標誌。因此它表示對剛才客戶端SYN報文的迴應;同時又標誌SYN給客戶端,詢問客戶端是否準備好進行資料通 訊。

(3) 客戶必須再次迴應服務段一個ACK報文,這是報文段3。

4.tcp和udp的區別

(1)基於連線與無連線;

(2)對系統資源的要求(TCP較多,UDP少);

(3)UDP程式結構較簡單;

(4)流模式與資料報模式 ;

(5)TCP保證資料正確性,UDP可能丟包,TCP保證資料順序,UDP不保證。

5.類似於QQ這種服務,用什麼協議通訊比較好

這個,實在是不知道怎麼考慮。。。

6.STL中的vector底層實現原理

這個也是經常被問到的,請參考部落格:http://blog.csdn.net/kevin_zhai/article/details/47747001

7.Linux下find查詢某一種型別檔案的命令

find 目錄 –name *.檔案的字尾名

8.Linux下檢視一個檔案最後10行的命令

tail –n 10 檔名

9.檢視Linux核心的命令

當時忘記了,應該是:uname -a 

10.資料庫中事務的概念

不會,網上找的答案:資料庫事務(DatabaseTransaction) ,是指作為單個邏輯工作單元執行的一系列操作,要麼完全地執行,要麼完全地不執行。 事務處理可以確保除非事務性單元內的所有操作都成功完成,否則不會永久更新面向資料的資源。通過將一組相關操作組合為一個要麼全部成功要麼全部失敗的單元,可以簡化錯誤恢復並使應用程式更加可靠。

11.設計一個key-value檢索系統,key為id值,value為大小0-1MB的字串。分別實現新增、刪除、修改和多執行緒查詢的功能。

我當時回答的是底層用map來做,每當對value值進行新增、刪除和修改操作時,要加鎖,這樣就避免了在查詢時,取到的字串與實際不符。

感覺別虐慘了,1,2,3,5,9,10都沒答上來。

最大的感觸:基礎還是太差,尤其是計算機網路、作業系統、Linux和資料庫這些,還是得加強基礎學習啊!!!重要的事情說三遍,基礎!基礎!!基礎!!!