技術面試官主要負責衡量你的技術水平,以及判斷你是否符合職位要求。總體而言,對科技公司,技術面試官的意見最為重要。技術面試包括電話面試和現場面試,前者主要偏向概念性的問答,也包括通過協作網站直接寫代碼等。現場面試通常包括白板寫代碼,解決一個算法問題或者設計問題等。本書的主要目的就是幫助你通過這輪面試。
一些面試的小技巧如下:一定要先溝通,明確自己了解題意,不要過分考慮或者欠考慮。首先可以給出一個比較容易想到、但并不是最優的解決方案,再逐步優化。在思考的時候也要把思路講出來,哪怕不是很成熟的方案。一旦遇到困難,可以先自己設法解決,如果五分鐘沒有思路,可以向面試官求助。適當的提示并不會影響你面試的最終結果。當開始寫程序的時候,盡量注意語法格式、變量命名等,避免寫偽代碼,越接近真實代碼越好。寫完以后自己檢查下有沒有明顯的錯誤,可以列舉幾個簡單的測試數據,與面試官一起檢驗一下整個運行過程。
面試是一個合作解決問題的過程,溝通一定是面試的關鍵:需要通過溝通展示你的邏輯性、理解能力和表達能力。在面試的最后,通常對方會給你提問的機會,你可以問的問題包括:團隊平時使用什么樣的技術,通常的工作壓力和工作時間,公司最讓人興奮的地方;在當前職位工作了多少年,面試官之前的工作經歷與現在相比有什么異同等。
面試考察的基本功,包括以下方面:
- 程序風格:能正確使用縮進,括號要對齊,變量名可以起的有意義;
- 編碼習慣:異常檢查,邊界處理;
- 溝通:讓面試官時刻明白你的意圖,不要閉著眼睛不停地寫。因為你的算法未必對。對了你也未必寫得出來。中間稍微有點問題,你就失敗了。對于面試官來說,他根本不知道你的解題進行到哪一步了;
- 測試:主動寫出合理的測試用例(Test case),一些常見的用例,如null檢查。一般你沒寫的話,面試官會讓你寫,但如果你主動寫出來,說明你有好的習慣,容易加分。
技術面試的流程通常如下,可供參考。
當你拿到一個具體問題時,可以按照以下流程回答:
1.明確題意:通過與面試官交流明確需要解答的問題。這部分主要為了讓自己放松心態,并且給面試官留下你具有良好團隊意識和交流能力的印象。
2.描述大體思路:描述你打算用什么算法,什么數據結構。主要是為了讓面試官了解你的思維過程,如果你給出的解答與他想要的答案偏差太多,可以及時糾正。同時,描述思路也給了你自己思考的機會。
3.實現算法:先處理邊界條件。對于重要的算法模塊,加一些注釋或者與面試官進行交流。目的是讓面試官始終了解你在做什么,算法框架是什么。
4.跑一個測試:用一個測試用例走一遍你寫的程序。目的在于和面試官一起確保你的算法是有效的,可以在過程中及時發現并糾正自己的錯誤。同時,給面試官留下你有寫單元測試(unit test)習慣的良好印象。
5.描述算法復雜度,回答面試官的問題。
- 內容提要
- 作者簡介
- 前言
- 我的故事,你的故事
- 現狀
- 目的
- 特色
- 第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 編譯器
- 版權信息
- 看完了