筆試面試(4)百度2014軟體開發工程師筆試題詳解
一.簡答題
1.簡述iso的7層設計解析:
- 應用層:提供應用程式間通訊
- 表示層:處理資料格式、資料加密等
- 會話層:建立、維護和管理會話
- 運輸層:建立主機端到端連線
- 網路層:定址和路由選擇
- 資料鏈路層:介質訪問,鏈路管理
- 物理層:位元流傳輸
2.如何在多個程序間進行資料共享(至少寫出3種)
Linux下:
- 管道
- 訊號量
- 共享記憶體
- 訊息佇列
- 本地域socket
Windows下:
- 檔案對映;檔案對映(Memory-Mapped Files)能使程序把檔案內容當作程序地址區間一塊記憶體那樣來對待。因此,程序不必使用檔案I/O操作,只需簡單的指標操作就可讀取和修改檔案的內容。
- 共享記憶體:Win32 API中共享記憶體(SharedMemory)實際就是檔案對映的一種特殊情況。程序在建立檔案對映物件時用0xFFFFFFFF來代替檔案控制代碼(HANDLE),就表示了對應的檔案對映物件是從作業系統頁面檔案訪問記憶體,其它程序開啟該檔案對映物件就可以訪問該記憶體塊。由於共享記憶體是用檔案對映實現的,所以它也有較好的安全性,也只能運行於同一計算機上的程序之間。
- 匿名管道:管道(Pipe)是一種具有兩個端點的通訊通道:有一端控制代碼的程序可以和有另一端控制代碼的程序通訊。管道可以是單向-一端是隻讀的,另一端點是隻寫的;也可以是雙向的一管道的兩端點既可讀也可寫。
- 命名管道:命名管道(Named Pipe)是伺服器程序和一個或多個客戶程序之間通訊的單向或雙向管道。不同於匿名管道的是命名管道可以在不相關的程序之間和不同計算機之間使用,伺服器建立命名管道時給它指定一個名字,任何程序都可以通過該名字開啟管道的另一端,根據給定的許可權和伺服器程序通訊。
- 郵件槽:郵件槽(Mailslots)提供程序間單向通訊能力,任何程序都能建立郵件槽成為郵件槽伺服器。其它程序,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽伺服器程序傳送訊息。進來的訊息一直放在郵件槽中,直到伺服器程序讀取它為止。一個程序既可以是郵件槽伺服器也可以是郵件槽客戶,因此可建立多個郵件槽實現程序間的雙向通訊。
- 剪貼簿:剪貼簿(Clipped Board)實質是Win32 API中一組用來傳輸資料的函式和訊息,為Windows應用程式之間進行資料共享提供了一箇中介,Windows已建立的剪下(複製)-貼上的機制為不同應用程式之間共享不同格式資料提供了一條捷徑。當用戶在應用程式中執行剪下或複製操作時,應用程式把選取的資料用一種或多種格式放在剪貼簿上。然後任何其它應用程式都可以從剪貼簿上拾取資料,從給定格式中選擇適合自己的格式。
- 動態資料交換:動態資料交換(DDE)是使用共享記憶體在應用程式之間進行資料交換的一種程序間通訊形式。應用程式可以使用DDE進行一次性資料傳輸,也可以當出現新資料時,通過傳送更新值在應用程式間動態交換資料。
- WM_COPYDATA訊息:WM_COPYDATA是一種非常強大卻鮮為人知的訊息。當一個應用向另一個應用傳送資料時,傳送方只需使用呼叫SendMessage函式,引數是目的視窗的控制代碼、傳遞資料的起始地址、WM_COPYDATA訊息。接收方只需像處理其它訊息那樣處理WM_COPY
TCP |
UDP |
|
是否有序 |
接收到的可能亂序,但是有段標號供排序 |
無序 |
可靠性 |
可靠的 |
不可靠的 |
是否連線 |
面相連線 |
面相非連線 |
負責 |
維護虛擬連線,負載較高 |
無連線,負載較小 |
是否確認 |
需要確認(可靠性的一種) |
不需要確認 |
是否有控制 |
滑動視窗和擁塞控制機制 |
無控制 |
二.演算法題
1.有一個數據A = [a_1,a_2,a_3.....a_n],n的大小不定,請設計演算法將A中的所有資料組合進行輸出
解析:可以採用遞迴的方式來實現,每次取一個元素,在剩下元素的陣列中遞迴,要注意遞迴結束的條件。
2.有這樣一個數組A,大小為n,相鄰元素差的絕對值都是1,如A={4,5,6,5,6,7,8,9,10,9},現在給定陣列A和目標整數t,請找到t在A中的位置。(15分)
解析:
解法一:常規解法:遍歷,時間複雜度O(n)
解法二:快速定位到第一個目標整數,後面繼續遍歷,最好情況下是O(1),最壞情況是O(n)
快速定位方法:以A[0]<t為例:
- dis = t - A[0],如果A[dis] = t,則定位到,
- 否則A[dis]必然小於t,重複步驟1
3.二叉樹的面積等於二叉樹的長乘以二叉樹的寬,二叉樹的寬等於最長節點間的距離,二叉樹的長等於根節點到子節點的最長長度,請設計演算法計算二叉樹的面積?
解析:面積 = 長 * 寬 = 樹的深度 * (左子樹的深度 + 右子樹的深度 + 1)
三.演算法設計題
百度地圖中存在需要標註的很多點,並且這些點都需要帶描述,現將描述假設為矩形,並且可以位於點的左邊或右邊,但點不能移動,如果兩個點間的描述發生覆蓋,則
需要將其中的一個點進行刪除
1.在一個區域內,請設計演算法將有效的點進行輸出(儘可能多的點)?
2.如果區域足夠大,點足夠多,演算法會出現效能的瓶頸,請設計詳細的演算法來說明並解決問題?
解析:個人理解
1 關鍵是在怎麼樣解決兩個點之間發生衝突的情況,在發生衝突時應該如何調整。
- 從地鐵左上角開始標記,逐行標記
- 預設的標記位置為點的右邊
- 當發生衝突時,檢視衝突區域的負責點,詢問是否可以調整為左置
- 如果被衝突點可以重置方向,則重置;否則,同樣發起詢問動作,直到有一個點重置成功為止。
2 效能瓶頸應該出現在調整演算法上,當發生一次衝突時,可能會引起連帶的反應,造成多次調整。
解決方案:對點進行分級,每個點增加權重,按級別進行標記,優先標記權重值較高的點。
參考資料: