本書是原谷歌資深面試官的經(jīng)驗(yàn)之作,緊扣程序員面試環(huán)節(jié),全面而詳盡地介紹了程序員要為面試做哪些準(zhǔn)備以及如何應(yīng)對(duì)面試。主要內(nèi)容涉及面試的流程解析、面試準(zhǔn)備工作,以及多家知名公司的面試題目及詳解。修訂版特別結(jié)合國內(nèi)科技公司的近況,修訂了上一版中的一些問題,增添了國內(nèi)科技公司的面試流程與注意事項(xiàng)。面試題目方面結(jié)合近年國內(nèi)科技公司的考查重點(diǎn),整合了原有的內(nèi)容,圍繞考核知識(shí)點(diǎn)精選了 100 多道題目,詳細(xì)講解了相關(guān)的算法策略。
本書適合程序開發(fā)人員和想要了解相關(guān)內(nèi)容的學(xué)生閱讀。
“一本就GO”型的面試寶典
√ 當(dāng)你實(shí)力足夠強(qiáng),就不再需要套路和花招!
本書被程序員稱為“高分高銷量”的算法面試書。
想憑強(qiáng)大的實(shí)力獲得令人羨慕的崗位?這本書就是為你而寫的。
√ 解析你夢(mèng)寐以求的公司的真題,助你關(guān)鍵時(shí)刻戰(zhàn)無不勝!
暴力拆解100道精選題目,助你輕松拿捏技術(shù)面試,
更有89道電子版題目更讓你技驚四座。
√ 面試主題系統(tǒng),循序漸進(jìn),緊扣面試環(huán)節(jié),讓你的技術(shù)精進(jìn)之路漸入佳境!數(shù)組與字符串、鏈表、棧與隊(duì)列、樹與圖、位操作、數(shù)學(xué)與邏輯題、面向?qū)ο笤O(shè)計(jì)、遞歸與動(dòng)態(tài)規(guī)劃、系統(tǒng)設(shè)計(jì)與可擴(kuò)展性、排序與查找、測試、C和C++、Java、數(shù)據(jù)庫、線程與鎖、實(shí)用數(shù)學(xué)、拓?fù)渑判、Dijkstra算法、散列表沖突解決方案、Rabin-Karp子串查找、AVL樹、紅黑樹、MapReduce......
蓋爾·拉克曼·麥克道爾,CareerCup創(chuàng)立人兼CEO,是一位軟件工程師,曾在微軟、蘋果與谷歌任職。她曾經(jīng)順利通過了微軟、谷歌、蘋果、IBM、高盛等多家名企極其嚴(yán)苛的面試過程,工作以后,她又成為一位出色的面試官,在谷歌任職期間,她還是谷歌招聘委員會(huì)成員,積累了相當(dāng)豐富的面試經(jīng)驗(yàn)。除此書外,還著有《產(chǎn)品經(jīng)理面試寶典》《金領(lǐng)簡歷:敲開蘋果、微軟、谷歌的大門》。
第 一部分 求職準(zhǔn)備 全面了解
第 1 章 面試之前 1
1.1 積累編程經(jīng)驗(yàn) 1
1.2 寫好簡歷 2
1.2.1 簡歷篇幅長度適中 2
1.2.2 工作經(jīng)歷 2
1.2.3 項(xiàng)目經(jīng)歷 2
1.2.4 軟件和編程語言 3
1.2.5 提防(潛在的)污名 3
第 2 章 面試的流程 4
2.1 面試準(zhǔn)備清單 4
2.1.1 你有哪些缺點(diǎn) 4
2.1.2 你應(yīng)該問面試官哪些問題 4
2.2 掌握項(xiàng)目所用的技術(shù) 5
2.3 如何應(yīng)對(duì)面試中的提問 5
2.3.1 正面應(yīng)答,避免自大 5
2.3.2 省略細(xì)枝末節(jié) 6
2.3.3 多談自己 6
2.3.4 回答條理清晰 6
2.4 自我介紹 7
2.4.1 結(jié)構(gòu) 7
2.4.2 展示成功的點(diǎn)點(diǎn)滴滴 8
2.5 面試流程 8
2.5.1 國內(nèi)企業(yè)的面試流程 9
2.5.2 國際企業(yè)面試的流程 11
2.6 面試成績 13
第 3 章 技術(shù)面試題 14
3.1 準(zhǔn)備事項(xiàng) 14
3.2 基礎(chǔ)知識(shí) 14
3.2.1 核心數(shù)據(jù)結(jié)構(gòu)、算法及概念 14
3.2.2 2 的冪表 15
3.3 解題步驟 15
3.3.1 認(rèn)真聽 16
3.3.2 畫個(gè)例圖 17
3.3.3 給出一個(gè)蠻力法 17
3.3.4 優(yōu)化 17
3.3.5 梳理 18
3.3.6 實(shí)現(xiàn) 18
3.3.7 測試 19
3.4 優(yōu)化和解題技巧 19
3.4.1 尋找 BUD 19
3.4.2 親力親為 22
3.4.3 化繁為簡 23
3.4.4 由淺入深 23
3.4.5 數(shù)據(jù)結(jié)構(gòu)頭腦風(fēng)暴法 24
3.5 可想象的極限運(yùn)行時(shí)間 24
3.6 處理錯(cuò)誤答案 27
3.7 做過的面試題 27
3.8 面試的“完美”語言 28
3.9 好代碼的標(biāo)準(zhǔn) 29
第二部分 技術(shù)面試題目中的基礎(chǔ)知識(shí)
第 4 章 大 O 33
4.1 時(shí)間復(fù)雜度 33
4.2 空間復(fù)雜度 35
4.3 刪除常量 35
4.4 丟棄不重要的項(xiàng) 36
4.5 多項(xiàng)式算法:加與乘 37
4.6 分?jǐn)倳r(shí)間 37
4.7 log N 運(yùn)行時(shí)間 38
4.8 遞歸的運(yùn)行時(shí)間 38
4.9 例題分析 39
第 5 章 數(shù)組與字符串 52
5.1 散列表 52
5.2 ArrayList 與可變長度數(shù)組 53
5.3 StringBuilder 53
第 6 章 鏈表 55
6.1 創(chuàng)建鏈表 55
6.2 刪除單向鏈表中的節(jié)點(diǎn) 56
6.3 “快行指針”技巧 56
6.4 遞歸問題 56
第 7 章 棧與隊(duì)列 57
7.1 實(shí)現(xiàn)一個(gè)棧 57
7.2 實(shí)現(xiàn)一個(gè)隊(duì)列 58
第 8 章 樹與圖 60
8.1 樹的類型 60
8.1.1 樹與二叉樹 60
8.1.2 二叉樹與二叉搜索樹 61
8.1.3 平衡與不平衡 61
8.1.4 完整二叉樹 61
8.1.5 滿二叉樹 62
8.1.6 完美二叉樹 62
8.2 二叉樹的遍歷 62
8.3 二叉堆(小頂堆與大頂堆) 63
8.4 單詞查找樹(前序樹) 64
8.5 圖 65
8.5.1 鄰接鏈表法 65
8.5.2 鄰接矩陣法 66
8.6 圖的搜索 66
8.6.1 深度優(yōu)先搜索 67
8.6.2 廣度優(yōu)先搜索 67
8.6.3 雙向搜索 68
第 9 章 位操作 69
9.1 手工位操作 69
9.2 位操作原理與技巧 69
9.3 二進(jìn)制補(bǔ)碼與負(fù)數(shù) 70
9.4 算術(shù)右移與邏輯右移 70
9.5 常見位操作:獲取與設(shè)置數(shù)位 71
第 10 章 數(shù)學(xué)與邏輯題 73
10.1 素?cái)?shù) 73
10.2 概率 75
10.3 總結(jié)規(guī)律和模式 76
第 11 章 面向?qū)ο笤O(shè)計(jì) 78
11.1 如何解答 78
11.2 設(shè)計(jì)模式 79
11.2.1 單例設(shè)計(jì)模式 79
11.2.2 工廠方法設(shè)計(jì)模式 79
第 12 章 遞歸與動(dòng)態(tài)規(guī)劃 81
12.1 解題思路 81
12.2 遞歸與迭代 81
12.3 動(dòng)態(tài)規(guī)劃及記憶法 82
第 13 章 系統(tǒng)設(shè)計(jì)與可擴(kuò)展性 86
13.1 處理問題 86
13.2 循環(huán)漸進(jìn)的設(shè)計(jì) 87
13.3 逐步構(gòu)建的方法:循序漸進(jìn) 88
13.4 關(guān)鍵概念 88
13.5 系統(tǒng)設(shè)計(jì)要考慮的因素 90
13.6 實(shí)例演示 91
第 14 章 排序與查找 93
14.1 常見的排序算法 93
14.2 查找算法 95
第 15 章 數(shù)據(jù)庫 97
15.1 SQL 語法及各類變體 97
15.2 規(guī)范化數(shù)據(jù)庫和反規(guī)范化數(shù)據(jù)庫 97
15.3 SQL 語句 97
15.4 小型數(shù)據(jù)庫設(shè)計(jì) 99
15.5 大型數(shù)據(jù)庫設(shè)計(jì) 100
第 16 章 C 和 C++ 101
16.1 類和繼承 101
16.2 構(gòu)造函數(shù)和析構(gòu)函數(shù) 101
16.3 虛函數(shù)102
16.4 虛析構(gòu)函數(shù) 103
16.5 默認(rèn)值104
16.6 操作符重載 104
16.7 指針和引用 104
16.8 模板 105
第 17 章 Java 107
17.1 如何處理 107
17.2 重載與重寫 107
17.3 集合框架 108
第 18 章 線程與鎖 110
18.1 Java 線程 110
18.2 同步和鎖 112
18.3 死鎖及死鎖的預(yù)防 114
第 19 章 測試 116
19.1 面試官想考查什么 116
19.2 測試現(xiàn)實(shí)生活中的事物 116
19.3 測試一套軟件 117
19.4 測試一個(gè)函數(shù) 119
19.5 調(diào)試與故障排除 119
第三部分 經(jīng)典題型 輕松拿捏
第 20 章 數(shù)組與字符串 121
20.1 判定字符是否唯一 121
20.2 URL 化 122
20.3 回文串排列 123
20.4 字符串壓縮 125
第 21 章 鏈表 128
21.1 返回倒數(shù)第 k 個(gè)節(jié)點(diǎn) 128
21.2 鏈表求和 130
21.3 鏈表相交 132
21.4 環(huán)路檢測 135
第 22 章 棧與隊(duì)列 138
22.1 三合一 138
22.2 化棧為隊(duì) 142
22.3 棧排序 143
第 23 章 樹與圖 145
23.1 特定深度節(jié)點(diǎn)鏈表 145
23.2 后繼者 146
23.3 編譯順序 147
23.4 首個(gè)共同祖先 153
23.5 二叉搜索樹序列 158
23.6 檢查子樹 160
23.7 隨機(jī)節(jié)點(diǎn) 163
23.8 求和路徑 166
第 24 章 位操作 171
24.1 插入 171
24.2 二進(jìn)制數(shù)轉(zhuǎn)字符串 172
24.3 下一個(gè)數(shù) 173
24.4 配對(duì)交換 177
第 25 章 數(shù)學(xué)與邏輯題 178
25.1 較重的藥丸 178
25.2 籃球問題 178
25.3 大災(zāi)難 179
25.4 扔雞蛋問題 181
25.5 有毒的汽水 183
第 26 章 面向?qū)ο笤O(shè)計(jì) 190
26.1 撲克牌 190
26.2 客服中心 192
26.3 聊天軟件 194
26.4 環(huán)狀數(shù)組 198
26.5 掃雷 200
26.6 散列表 205
第 27 章 遞歸與動(dòng)態(tài)規(guī)劃 207
27.1 三步問題 207
27.2 冪集 208
27.3 遞歸乘法 210
27.4 無重復(fù)字符串的排列組合 212
27.5 重復(fù)字符串的排列組合 215
27.6 括號(hào) 216
27.7 布爾運(yùn)算 218
第 28 章 系統(tǒng)設(shè)計(jì)與可擴(kuò)展性 221
28.1 網(wǎng)絡(luò)爬蟲 221
28.2 重復(fù)網(wǎng)址 222
28.3 緩存 222
28.4 銷售排名 225
28.5 個(gè)人理財(cái)管理 228
第 29 章 排序與查找 231
29.1 變位詞組 231
29.2 搜索輪轉(zhuǎn)數(shù)組 232
29.3 排序集合的查找 233
29.4 失蹤的整數(shù) 234
29.5 排序矩陣查找 238
29.6 峰與谷 241
第 30 章 數(shù)據(jù)庫 244
30.1 多套公寓 244
30.2 連接 244
30.3 反規(guī)范化 245
30.4 設(shè)計(jì)分級(jí)數(shù)據(jù)庫 246
第 31 章 C 和 C++ 248
31.1 最后 K 行 248
31.2 反轉(zhuǎn)字符串 249
31.3 散列表與 STL map 249
31.4 淺復(fù)制與深復(fù)制 250
31.5 volatile 關(guān)鍵字 251
31.6 分配內(nèi)存 252
31.7 二維數(shù)組分配 253
第 32 章 Java 255
32.1 私有構(gòu)造函數(shù) 255
32.2 final 們 255
32.3 泛型與模板 256
32.4 TreeMap、HashMap、LinkedHashMap 258
32.5 反射 259
32.6 lambda 表達(dá)式 259
第 33 章 線程與鎖 261
33.1 進(jìn)程與線程 261
33.2 上下文切換 261
33.3 無死鎖的類 262
33.4 順序調(diào)用 266
33.5 FizzBuzz 268
第 34 章 測試 271
34.1 隨機(jī)崩潰 271
34.2 無工具測試 271
第 35 章 中等難題 273
35.1 交換數(shù)字 273
35.2 交點(diǎn) 274
35.3 最小差 276
35.4 整數(shù)的英文表示 277
35.5 運(yùn)算 279
35.6 生存人數(shù) 282
35.7 部分排序 286
35.8 連續(xù)數(shù)列 288
35.9 模式匹配 290
35.10 交換求和 293
35.11 蘭頓螞蟻 296
35.12 1×5 個(gè)隨機(jī)數(shù)方法中生成 7 個(gè)隨機(jī)數(shù) 301
第 36 章 高難度題 304
36.1 不用加號(hào)的加法 304
36.2 消失的數(shù)字 305
36.3 字母與數(shù)字 307
36.4 2 出現(xiàn)的次數(shù) 310
36.5 主要元素 312
36.6 BiNode 315
36.7 最小 k 個(gè)數(shù) 318
36.8 多次搜索 323
36.9 消失的兩個(gè)數(shù)字 327
36.10 單詞轉(zhuǎn)換 331
36.11 最大子矩陣 336
36.12 稀疏相似度 341
第 37 章 進(jìn)階話題 348
37.1 實(shí)用數(shù)學(xué) 348
37.1.1 整數(shù) 1 至 N 的和 348
37.1.2 2 的冪的和 349
37.1.3 對(duì)數(shù)的底 349
37.1.4 排列 349
37.1.5 組合 349
37.1.6 歸納證明 350
37.2 拓?fù)渑判? 350
37.3 Dijkstra 算法 351
37.4 散列表沖突解決方案 353
37.4.1 使用鏈表連接數(shù)據(jù) 354
37.4.2 使用二叉搜索樹連接數(shù)據(jù) 354
37.4.3 使用線性探測進(jìn)行開放尋址 354
37.4.4 平方探測和雙重散列 354
37.5 Rabin-Karp 子串查找 354
37.6 AVL 樹 355
37.6.1 性質(zhì) 355
37.6.2 插入操作 355
37.7 紅黑樹356
37.7.1 性質(zhì) 357
37.7.2 為什么這樣的樹是平衡的 357
37.7.3 插入操作 357
37.8 MapReduce 360
37.9 補(bǔ)充學(xué)習(xí)內(nèi)容 361