百度2014軟件開發工程師筆試題詳解

一.簡答題算法

1.簡述iso的7層設計數組

解析:安全

 

  1. 應用層:提供應用程序間通訊
  2. 表示層:處理數據格式、數據加密等
  3. 會話層:創建、維護和管理會話
  4. 運輸層:創建主機端到端鏈接
  5. 網絡層:尋址和路由選擇
  6. 數據鏈路層:介質訪問,鏈路管理
  7. 物理層:比特流傳輸

 

2.如何在多個進程間進行數據共享(至少寫出3種)服務器

Linux下:網絡

 

  • 管道
  • 信號量
  • 共享內存
  • 消息隊列
  • 本地域socket

 

Windows下:app

  1. 文件映射;文件映射(Memory-Mapped Files)能使進程把文件內容看成進程地址區間一塊內存那樣來對待。所以,進程沒必要使用文件I/O操做,只需簡單的指針操做就可讀取和修改文件的內容。
  2. 共享內存:Win32 API中共享內存(SharedMemory)實際就是文件映射的一種特殊狀況。進程在建立文件映射對象時用0xFFFFFFFF來代替文件句柄(HANDLE),就表示了對應的文件映射對象是從操做系統頁面文件訪問內存,其它進程打開該文件映射對象就能夠訪問該內存塊。因爲共享內存是用文件映射實現的,因此它也有較好的安全性,也只能運行於同一計算機上的進程之間。
  3. 匿名管道:管道(Pipe)是一種具備兩個端點的通訊通道:有一端句柄的進程能夠和有另外一端句柄的進程通訊。管道能夠是單向-一端是隻讀的,另外一端點是隻寫的;也能夠是雙向的一管道的兩端點既可讀也可寫。
  4. 命名管道:命名管道(Named Pipe)是服務器進程和一個或多個客戶進程之間通訊的單向或雙向管道。不一樣於匿名管道的是命名管道能夠在不相關的進程之間和不一樣計算機之間使用,服務器創建命名管道時給它指定一個名字,任何進程均可以經過該名字打開管道的另外一端,根據給定的權限和服務器進程通訊。
  5. 郵件槽:郵件槽(Mailslots)提供進程間單向通訊能力,任何進程都能創建郵件槽成爲郵件槽服務器。其它進程,稱爲郵件槽客戶,能夠經過郵件槽的名字給郵件槽服務器進程發送消息。進來的消息一直放在郵件槽中,直到服務器進程讀取它爲止。一個進程既能夠是郵件槽服務器也能夠是郵件槽客戶,所以可創建多個郵件槽實現進程間的雙向通訊。
  6. 剪貼板:剪貼板(Clipped Board)實質是Win32 API中一組用來傳輸數據的函數和消息,爲Windows應用程序之間進行數據共享提供了一箇中介,Windows已創建的剪切(複製)-粘貼的機制爲不一樣應用程序之間共享不一樣格式數據提供了一條捷徑。當用戶在應用程序中執行剪切或複製操做時,應用程序把選取的數據用一種或多種格式放在剪貼板上。而後任何其它應用程序均可以從剪貼板上拾取數據,從給定格式中選擇適合本身的格式。
  7. 動態數據交換:動態數據交換(DDE)是使用共享內存在應用程序之間進行數據交換的一種進程間通訊形式。應用程序可使用DDE進行一次性數據傳輸,也能夠當出現新數據時,經過發送更新值在應用程序間動態交換數據。
  8. WM_COPYDATA消息:WM_COPYDATA是一種很是強大卻不爲人知的消息。當一個應用向另外一個應用傳送數據時,發送方只需使用調用SendMessage函數,參數是目的窗口的句柄、傳遞數據的起始地址、WM_COPYDATA消息。接收方只需像處理其它消息那樣處理WM_COPY
3.簡述TCP與UDP的區別

 

 TCPsocket

 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爲例:

 

  1. dis = t - A[0],若是A[dis] = t,則定位到,
  2. 不然A[dis]必然小於t,重複步驟1

 

3.二叉樹的面積等於二叉樹的長乘以二叉樹的寬,二叉樹的寬等於最長節點間的距離,二叉樹的長等於根節點到子節點的最長長度,請設計算法計算二叉樹的面積?

解析:面積 = 長 * 寬 = 樹的深度 * (左子樹的深度 + 右子樹的深度 + 1)

 

三.算法設計題

百度地圖中存在須要標註的不少點,而且這些點都須要帶描述,現將描述假設爲矩形,而且能夠位於點的左邊或右邊,但點不能移動,若是兩個點間的描述發生覆蓋,則

須要將其中的一個點進行刪除

1.在一個區域內,請設計算法將有效的點進行輸出(儘量多的點)?

2.若是區域足夠大,點足夠多,算法會出現性能的瓶頸,請設計詳細的算法來講明並解決問題?

解析:我的理解

1 關鍵是在怎麼樣解決兩個點之間發生衝突的狀況,在發生衝突時應該如何調整。

 

  1.     從地鐵左上角開始標記,逐行標記
  2.     默認的標記位置爲點的右邊
  3.     當發生衝突時,查看衝突區域的負責點,詢問是否能夠調整爲左置
  4.     若是被衝突點能夠重置方向,則重置;不然,一樣發起詢問動做,直到有一個點重置成功爲止。

 

2 性能瓶頸應該出如今調整算法上,當發生一次衝突時,可能會引發連帶的反應,形成屢次調整。

    解決方案:對點進行分級,每一個點增長權重,按級別進行標記,優先標記權重值較高的點。

 

參考資料:

如何實現進程間通訊? 

 
http://feinibuke.blog.51cto.com/1724260/340272   TCP和UDP之間的區別
相關文章
相關標籤/搜索