面過百度/騰訊/小米/網易/搜狗/知乎/京東/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的負載均衡
- 分佈式緩存的一致性,服務器如何擴容(哈希環)
總之要把寫在簡歷上的項目部分熟悉一遍,技術棧、項目功能、難點都要考慮好。
閱讀更多 優知學院 的文章