市面上關于程序員面試的參考書也不少,但是我們認為這些書的關鍵問題在于它們大多是教你“怎么做”,但很少涉及“為什么這么做”。于是,讀者往往會覺得書中的解法十分精妙,但是在面試的時候完全想不起來用哪種方法解決問題。其根本原因在于,這些參考書代替你做了最關鍵的一步:判斷用什么方法解決當前的問題。
本書遵從大多數面試參考書的構成方式,結合實例,按照常見的數據結構、算法以及計算機基礎知識進行章節劃分,但是,本書著眼于如何進行“模式識別”,通過分析為什么這個問題被劃分到這個章節,來教大家如何判斷實際面試問題的類型,并且順水推舟地得出解決問題的方法。每一章的“知識要點”介紹章節涉及的相關知識點,回顧通常出現在教材中的重點內容;“模式識別”給出一些實例,幫助大家總結解決相關問題的常見方法,并且通過分析問題中的關鍵信息,教授大家如何從題目中得到關于題型分類以及解題方法的蜘絲馬跡。
本書收集的題目部分來自互聯網上分享的面試經驗、在線編程網站leetcode,以及面試參考資料Cracking the Coding Interview和Element of Programming Interview。如果你認真準備過面試,可能會對題目有似曾相識的感覺。但本書的關鍵不是教會你做一道題目,而是教會分析題目、解決題目的方法,從而學會解一類題目。具體的題目不是關鍵,從題目到方法的思維過程,是本書努力想傳達的重點;最后,“工具箱”部分給出該章涉及的C++/Java類,它們的常見函數及使用方法,還提供一些標準庫函數,以及相關參考資料或擴展閱讀。
如果你有志于投身到滾滾的IT互聯網浪潮中,無論你是一個學生,還是初級程序員,不論你以后是定位于架構師還是項目經理,你都需要一塊敲門磚,那么這本書就是為你量身定做的。作為有著在國內外創業公司和一線公司經歷的過來人,我們希望本書能給你職業生涯上添磚加瓦,幫助大家到達理想的彼岸。
最后,我們特別感謝Ruthia百忙之中抽空幫助設計封面。正如封面中錘子所象征的那樣,每個人都需要付出持之以恒的努力才能獲得成績,在此與讀者共勉。
由于水平有限,編寫過程中難免產生疏漏。如果在閱讀本書的過程中你有任何建議和問題,請聯系我們:UltimateGuideToCodingInterview@gmail.com。
- 內容提要
- 作者簡介
- 前言
- 我的故事,你的故事
- 現狀
- 目的
- 特色
- 第1章 簡歷、面試和Offer
- 1.1 簡歷
- 1.1.1 格式
- 1.1.2 內容安排
- 1.1.3 描述技巧
- 1.2 面試
- 1.2.1 HR
- 1.2.2 技術面試官
- 1.2.3 老板
- 1.3 Offer
- 1.4 常見問題
- 1.5 工具箱
- 第2章 數組和字符串
- 2.1 知識要點
- 2.1.1 數組
- 2.1.2 哈希表
- 2.1.3 String
- 2.2 模式識別
- 2.2.1 使用哈希表
- 2.2.2 利用哈希表實現動態規劃的思想
- 2.2.3 String相關問題的處理技巧
- 2.3 工具箱
- 第3章 鏈表
- 3.1 知識要點
- 3.2 模式識別
- 3.2.1 鏈表的基本操作
- 3.2.2 啞節點
- 3.2.3 Runner和Chaser
- 3.2.4 遍歷并處理節點
- 3.2.5 交換節點的問題
- 3.2.6 同時操作兩個鏈表
- 3.2.7 倒序處理
- 3.3 工具箱
- 第4章 棧和隊列
- 4.1 知識要點
- 4.1.1 棧
- 4.1.2 隊列
- 4.2 模式識別
- 4.2.1 通過棧實現特殊順序的讀取
- 4.2.2 “Save for later”問題
- 4.2.3 用棧解決自上而下結構的問題
- 4.3 工具箱
- 第5章 樹和圖
- 5.1 知識要點
- 5.1.1 樹
- 5.1.2 字典樹
- 5.1.3 堆與優先隊列
- 5.1.4 圖
- 5.1.5 圖的遍歷
- 5.1.6 單源最短路徑問題
- 5.1.7 任意兩點之間的最短距離
- 5.2 模式識別
- 5.2.1 利用分而治之(D&C)策略判斷樹、圖的性質
- 5.2.3 樹和其他數據結構的相互轉換
- 5.2.4 尋找特定節點
- 5.2.5 圖的訪問
- 5.3 工具箱
- 第6章 位操作
- 6.1 知識要點
- 6.2 模式識別
- 6.2.1 基本的位操作
- 6.2.2 位掩碼
- 6.3 工具箱
- 第7章 面向對象的設計
- 7.1 知識要點
- 7.1.1 設計題解答要領
- 7.1.2 模擬面試
- 7.1.3 抽象、面向對象和解耦(Decoupling)
- 7.1.4 繼承/組合/參數化類型
- 7.1.5 設計模式
- 7.2 模式識別
- 7.3 工具箱
- 第8章 遞歸和動態規劃
- 8.1 知識要點
- 8.1.1 構建從子問題到最終目標的方法
- 8.1.2 遞歸的空間與時間成本
- 8.1.3 自底向上與自頂向下
- 8.1.4 算法策略
- 8.2 模式識別
- 8.2.1 用動態規劃(自底向上)解決收斂結構問題
- 8.2.2 最長子序列類型的問題
- 8.2.3 用Memorization(自頂向下)解決收斂結構問題
- 8.2.4 用回溯法(自上而下)解決發散結構問題
- 8.2.5 用D&C策略解決獨立子問題
- 第9章 排序和搜索
- 9.1 知識要點
- 9.1.1 常見的內排序算法
- 9.1.2 常見的外排序算法
- 9.1.3 快速選擇算法
- 9.1.4 二分查找
- 9.2 模式識別
- 9.2.1 動態數據結構的維護
- 9.2.2 對于有序/部分有序容器的搜索,用二分查找
- 9.2.3 數據范圍有限、離散的排序問題
- 9.2.4 Scalability & Memory Limits 問題
- 9.3 工具箱
- 第10章 測試
- 10.1 知識要點
- 10.1.1 測試現實世界的物體、軟件或函數
- 10.1.2 故障排除
- 10.2 模式識別
- 10.3 工具箱
- 第11章 網絡
- 11.1 知識要點
- 11.1.1 網絡分層
- 11.1.2 路由
- 11.1.3 常用網絡統計指標
- 11.1.4 TCP vs. UDP
- 11.2 模式識別
- 11.3 工具箱
- 第12章 計算機底層知識
- 12.1 知識要點
- 12.1.1 進程vs.線程
- 12.1.2 上下文切換
- 12.1.3 系統調用
- 12.1.4 Semaphore/Mutex
- 12.1.5 死鎖
- 12.1.6 生產者消費者
- 12.1.7 進程間通信
- 12.1.8 邏輯地址/物理地址/虛擬內存
- 12.1.9 文件系統
- 12.1.10 實時vs.分時操作系統
- 12.1.11 編譯器
- 版權信息
- 看完了