07.29 BAT後端開發面試108題:數據庫、Redis、操作系統、算法、Linux

面過百度/騰訊/小米/網易/搜狗/知乎/京東/360/瓜子,期間總結了一些面試題目,現在放上來。

根據博主的面試經驗來看,面試有一定的層次性,如bat級別公司每個點都會深入,而有些公司則只會問到表層,所以將每個領域都分為必須掌握和深入瞭解這兩個部分。

一、計算機網絡

基礎部分

TCP報頭格式UDP報頭格式TCP/UDP區別(不僅是宏觀上的,最好能根據各自的機制講解清楚)HTTP狀態碼(最好結合使用場景,比如在緩存命中時使用哪個)HTTP協議(一些報頭字段的作用,如cace-control、keep-alive)OSI協議、TCP/IP協議以及每層對應的協議。SESSION機制、cookie機制TCP三次握手、四次揮手(這個問題真的要回答吐了,不過真的是面試官最喜歡問的,建議每天手擼一遍,而且不只是每次請求的過程,各種FIN_WAIT、TIME_WAIT狀態也要掌握)。打開網頁到頁面顯示之間的過程(涵蓋了各個方面,DNS解析過程,Nginx請求轉發、連接建立和保持過程、瀏覽器內容渲染過程,考慮的越詳細越好)。http和https區別,https在請求時額外的過程,https是如何保證數據安全的IP地址子網劃分POST和GET區別DNS解析過程

深入部分

13. TCP如何保證數據的可靠傳輸的(這個問題可以引申出很多子問題,擁塞控制慢開始、擁塞避免、快重傳、滑動窗口協議、停止等待協議、超時重傳機制,最好都能掌握)

14. 地址解析協議ARP

15. 交換機和路由器的區別

二、數據庫

基礎部分

事務四大特性(ACID)數據庫隔離級別,每個級別會引發什麼問題,mysql默認是哪個級別MYSQL的兩種存儲引擎區別(事務、鎖級別等等),各自的適用場景數據庫的優化(從sql語句優化和索引兩個部分回答)索引有B+索引和hash索引,各自的區別B+索引數據結構,和B樹的區別索引的分類(主鍵索引、唯一索引),最左前綴原則,哪些情況索引會失效聚集索引和非聚集索引區別。有哪些鎖(樂觀鎖悲觀鎖),select時怎麼加排它鎖關係型數據庫和非關係型數據庫區別瞭解nosql數據庫三範式,根據某個場景設計數據表(可以通過手繪ER圖)數據庫的主從複製使用explain優化sql和索引long_query怎麼解決內連接、外連接、交叉連接、笛卡兒積等

深入

MVCC機制根據具體場景,說明版本控制機制死鎖怎麼解決varchar和char的使用場景。mysql併發情況下怎麼解決(通過事務、隔離級別、鎖)

Redis

redis數據結構有哪些redis隊列應用場景redis和Memcached(支持數據持久化)分佈式使用場景(儲存session等)發佈/訂閱使用場景

三、操作系統

內存的頁面置換算法進程調度算法進程間通信方式進程線程區別進程之間的通信父子進程、孤兒進程fork進程時的操作, 這個部分我回答的都不好,只能是死記硬背,建議基礎好的同學多看看操作系統這部分,能大大加分。

四、算法

基礎

劍指OFFER的各個題目是最常見的,即使不是原題也是題目的變體,因為面試不像筆試,一般不會出特別困難的題目,所以劍指OFFER上小而精的題目就非常適合。建議手刷一遍。PHP的同學可以參考專欄劍指OFFER二叉樹相關(層次遍歷、求深度、求兩個節點距離、翻轉二叉樹、前中後序遍歷)鏈表相關(插入節點、鏈表逆置、使用鏈表進行大數字的加減,雙向鏈表實現隊列、尋找鏈表中的環)堆(大量數據中尋找最大N個數字幾乎每次都會問,還有堆在插入時進行的調整)排序(八大排序,各自的時間複雜度、排序算法的穩定性。快排幾乎每次都問)二分查找(一般會深入,如尋找數組總和為K的兩個數字)兩個棧實現隊列。圖(深度廣度優先遍歷、單源最短路徑、最小生成樹)動態規劃問題。
深入紅黑樹性質分治法和動態規劃的區別計算時間複雜度二叉樹和哈希表查找的時間複雜度

棧和鏈表是面試算法的時候經常用到的工具,多考慮怎麼用數據結構的性質解決,因為面試不像筆試,對基礎數據結構關注的比較多一些,一般問題也比較簡單。然後取模也是常用的工具(比如有一次問怎麼讓100個進程按規定的權重被調用,就可以用取模的方式)。

面試官一般會先出簡單的問題,然後深入地問下去,最好是根據他的思路走,因為能聽懂他的提示也是需要考察的能力。

LINUX

硬鏈接和軟連接區別kill用法,某個進程殺不掉的原因(進入內核態,忽略kill信號)linux用過的命令系統管理命令(如查看內存使用、網絡情況)管道的使用 |grep的使用,一定要掌握,每次都會問在文件中查找shell腳本find命令awk使用

語言部分(PHP)

數組操作函數字符串操作函數(數組和字符串的函數是最常問的,非常多,一定不要記混了)指針和引用區別堆和棧的區別== ===區別PHP的垃圾回收機制zval結構防sql注入跨域問題長鏈接和長輪詢

面向對象、設計模式

接口和抽象類區別單繼承construct的調用順序(子類父類之間)設計模式(工廠模式、策略模式、單例模式、裝飾模式比較常見)OOP特性,通過哪些機制實現的重寫和重載區別靜態類靜態方法根據某個需求設計一個類(主要考慮類之間的繼承關係和屬性的權限設置)

項目

項目中遇到的困難(提前想好,並且把實現或者優化方法說清楚)系統的量級、pv、uv等應對高併發的解決辦法(分佈式)在項目中主要負責了哪些工作。nginx的負載均衡分佈式緩存的一致性,服務器如何擴容(哈希環)

總之要把寫在簡歷上的項目部分熟悉一遍,技術棧、項目功能、難點都要考慮好。