本書是原谷歌面試官的經(jīng)驗(yàn)之作,層層緊扣程序員面試的每一個(gè)環(huán)節(jié),全面而詳盡地介紹了程序員應(yīng)當(dāng)如何應(yīng)對(duì)面試,才能在面試中脫穎而出。內(nèi)容主要涉及面試流程解析,面試官的幕后決策及可能提出的問題,面試前的準(zhǔn)備工作,對(duì)面試結(jié)果的處理,以及出自微軟、蘋果、谷歌等多家知名公司的189道編程面試題及詳細(xì)解決方案。第6版修訂了上一版中一些題目的解法,為各章新增了介紹性內(nèi)容,加入了更多的算法策略,并增添了對(duì)所有題目的提示信息。
《程序員面試金典》是一本硅谷互聯(lián)網(wǎng)公司技術(shù)面試的經(jīng)典圖書,被譽(yù)為程序員面試紅寶書。作者是原谷歌zi深面試官,她結(jié)合自身豐富的面試經(jīng)歷,以及多年對(duì)互聯(lián)網(wǎng)招聘行業(yè)形勢(shì)的整理歸納,幫助許多想要加入Facebook、亞馬遜、微軟、蘋果等互聯(lián)網(wǎng)企業(yè)的求職者獲得了心儀的工作機(jī)會(huì)。 《程序員面試金典》將幫助你磨練應(yīng)聘的能力,你可以學(xué)會(huì)發(fā)現(xiàn)面試問題中的提示和隱藏細(xì)節(jié),了解如何將一個(gè)面試問題分解為若干小的子問題,培養(yǎng)面試中克服障礙的技巧,溫習(xí)經(jīng)常會(huì)被問及的計(jì)算機(jī)科學(xué)核心概念,從而為真槍實(shí)彈的面試做好充足準(zhǔn)備,現(xiàn)場(chǎng)發(fā)揮理想狀態(tài)。 ●189道難易不同的面試真題,每道問題都提供了詳細(xì)解題過程 ●通過解答提示模擬真實(shí)面試場(chǎng)景 ●5個(gè)已被證實(shí)的解決算法問題的有效策略 ●大O時(shí)間復(fù)雜度、數(shù)據(jù)結(jié)構(gòu)和核心算法等基本話題討論 ●探秘IT名企如何招聘軟件工程師 ●準(zhǔn)備面試中軟技能的技巧,使自己行為得體 ●從招聘公司和面試官角度,設(shè)計(jì)了面試與招聘流程的細(xì)節(jié)
蓋爾· 拉克曼·麥克道爾(Gayle Laakmann McDowell),CareerCup創(chuàng)始人兼CEO,是一位知名軟件工程師,曾在微軟、蘋果與谷歌任職。早先,她自己是一位十分成功的求職者,通過了微軟、谷歌、亞馬遜、蘋果、IBM、高盛等多家知名企業(yè)極其嚴(yán)苛的面試過程。工作以后,她又成為一位出色的面試官。在谷歌任職期間,她還是該公司有名的面試官及招聘委員會(huì)成員,其間閱人無數(shù),積累了相當(dāng)豐富的面試經(jīng)驗(yàn)。除此書外,還著有《產(chǎn)品經(jīng)理面試寶典》《金領(lǐng)簡(jiǎn)歷:敲開蘋果、微軟、谷歌的大門》。 【譯者簡(jiǎn)介】 劉博楠,軟件工程師,畢業(yè)于哥倫比亞大學(xué),現(xiàn)居美國(guó)紐約,就職于谷歌公司,從事云計(jì)算產(chǎn)品的研發(fā)工作,同時(shí)在紐約城市大學(xué)任兼職講師。對(duì)分布式系統(tǒng)、云計(jì)算、數(shù)據(jù)庫研發(fā)有著濃厚的興趣。對(duì)超大規(guī)模系統(tǒng)架構(gòu)設(shè)計(jì)、流程管理、高可用服務(wù)運(yùn)維等領(lǐng)域也有涉獵。 趙鵬飛,畢業(yè)于西安電子科技大學(xué),目前在蔚來汽車做開發(fā)工作。熱愛技術(shù),愛好開源,曾為流行開源項(xiàng)目OpenFeign貢獻(xiàn)源碼,近來專注于開源項(xiàng)目Spring及Spring Boot。熱愛算法,一直活躍于leetcode、?途W(wǎng)等算法網(wǎng)站。 李琳驍,主要從事嵌入式Linux內(nèi)核/驅(qū)動(dòng)開發(fā),并關(guān)注IT、開放源碼和安防監(jiān)控等領(lǐng)域。業(yè)余時(shí)間以技術(shù)翻譯為樂,翻譯或參與翻譯了《Linux命令詳解手冊(cè)》《編程人生》《編程大師訪談錄》等圖書。 漆犇,畢業(yè)于中國(guó)地質(zhì)大學(xué),擁有十余年軟件開發(fā)、測(cè)試及流程管理經(jīng)驗(yàn),熱衷翻譯,已出版譯作包括《Linux/Unix設(shè)計(jì)思想》《金領(lǐng)簡(jiǎn)歷:敲開蘋果、微軟、谷歌的大門》等書。
第 1 章 面試流程 1
1.1 為什么 1
1.1.1 錯(cuò)過了優(yōu)秀人才是可以的 2
1.1.2 解決問題的技能很寶貴 2
1.1.3 基礎(chǔ)數(shù)據(jù)結(jié)構(gòu)和算法知識(shí)很有用 2
1.1.4 白板讓你專注于重要的事情 2
1.1.5 但這并不適用于每個(gè)人、每家公司、每種場(chǎng)合 3
1.2 面試問題的來源 3
1.3 一切都是相對(duì)的 3
1.4 常見問題 4
1.4.1 面試結(jié)束后沒有立即收到回復(fù),我是被拒了嗎 4
1.4.2 被拒之后我還能重新申請(qǐng)嗎 4
第 2 章 面試揭秘 5
2.1 微軟面試 6
2.1.1 必備項(xiàng) 6
2.1.2 獨(dú)特之處 6
2.2 亞馬遜面試 6
2.2.1 必備項(xiàng) 7
2.2.2 獨(dú)特之處 7
2.3 谷歌面試 7
2.3.1 必備項(xiàng) 8
2.3.2 獨(dú)特之處 8
2.4 蘋果面試 8
2.4.1 必備項(xiàng) 9
2.4.2 獨(dú)特之處 9
2.5 Facebook面試 9
2.5.1 必備項(xiàng) 9
2.5.2 獨(dú)特之處 10
2.6 Palantir面試 10
2.6.1 必備項(xiàng) 10
2.6.2 獨(dú)特之處 10
第 3 章 特殊情況 11
3.1 有工作經(jīng)驗(yàn)的求職者 11
3.2 測(cè)試人員和軟件開發(fā)測(cè)試工程師 11
3.3 產(chǎn)品經(jīng)理(項(xiàng)目經(jīng)理) 12
3.4 開發(fā)主管與部門經(jīng)理 13
3.5 創(chuàng)業(yè)公司 13
3.5.1 職位申請(qǐng) 14
3.5.2 簽證與工作許可 14
3.5.3 簡(jiǎn)歷篩選因素 14
3.5.4 面試流程 14
3.6 收購與人才收購 14
3.6.1 哪些創(chuàng)業(yè)公司需要進(jìn)行并購面試,為什么 14
3.6.2 這些面試有多重要 15
3.6.3 哪些員工需要面試 15
3.6.4 如果面試表現(xiàn)不好會(huì)怎么樣 15
3.6.5 最優(yōu)秀和最差的員工或許會(huì)令你吃驚 16
3.6.6 被收購方的員工與一般求職者的標(biāo)準(zhǔn)一樣嗎 16
3.6.7 被收購員工對(duì)于收購、人才收購會(huì)如何反應(yīng) 16
3.6.8 收購后的團(tuán)隊(duì)會(huì)經(jīng)歷什么 16
3.6.9 怎樣為你的團(tuán)隊(duì)準(zhǔn)備收購面試 16
3.7 面試官 17
3.7.1 不要問與本書完全相同的題目 17
3.7.2 問中等難題或者高難度題 17
3.7.3 使用多重障礙的題目 17
3.7.4 使用高難度題目,而不是艱深的基礎(chǔ)知識(shí) 18
3.7.5 避免嚇人的問題 18
3.7.6 提供正面鼓勵(lì) 19
3.7.7 深究行為面試題 19
3.7.8 輔導(dǎo)求職者 19
3.7.9 如果求職者想保持安靜,請(qǐng)滿足 20
3.7.10 了解你的模式:完整性測(cè)試、質(zhì)量測(cè)試、專業(yè)知識(shí)和代理知識(shí) 20
第 4 章 面試之前 22
4.1 積累相關(guān)經(jīng)驗(yàn) 22
4.2 寫好簡(jiǎn)歷 23
4.2.1 簡(jiǎn)歷篇幅長(zhǎng)度適中 23
4.2.2 工作經(jīng)歷 23
4.2.3 項(xiàng)目經(jīng)歷 23
4.2.4 軟件和編程語言 24
4.2.5 給母語為非英語的人及國(guó)際人士的建議 24
4.2.6 提防(潛在的)污名 24
4.3 準(zhǔn)備流程圖 25
第 5 章 行為面試題 28
5.1 面試準(zhǔn)備清單 28
5.1.1 你有哪些缺點(diǎn) 28
5.1.2 你應(yīng)該問面試官哪些問題 28
5.2 掌握項(xiàng)目所用的技術(shù) 29
5.3 如何應(yīng)對(duì) 29
5.3.1 力求具體,切忌自大 29
5.3.2 省略細(xì)枝末節(jié) 30
5.3.3 多談自己 30
5.3.4 回答條理清晰 30
5.3.5 行動(dòng)是關(guān)鍵 31
5.3.6 故事的意義 31
5.4 自我介紹 32
5.4.1 結(jié)構(gòu) 32
5.4.2 興趣愛好 32
5.4.3 展示成功的點(diǎn)點(diǎn)滴滴 33
第 6 章 大Ο 34
6.1 打個(gè)比方 34
6.2 時(shí)間復(fù)雜度 34
6.2.1 大Ο、大和大 35
6.2.2 最優(yōu)、最壞和期望情況 35
6.3 空間復(fù)雜度 36
6.4 刪除常量 36
6.5 丟棄不重要的項(xiàng) 37
6.6 多項(xiàng)式算法:加與乘 38
6.7 分?jǐn)倳r(shí)間 38
6.8 Log N運(yùn)行時(shí)間 39
6.9 遞歸的運(yùn)行時(shí)間 39
6.10 示例和習(xí)題 40
第 7 章 技術(shù)面試題 53
7.1 準(zhǔn)備事項(xiàng) 53
7.2 必備的基礎(chǔ)知識(shí) 53
7.2.1 核心數(shù)據(jù)結(jié)構(gòu)、算法及概念 53
7.2.2 2的冪表 54
7.3 解題步驟 54
7.4 優(yōu)化和解題技巧 1:尋找BUD 58
7.4.1 瓶頸 59
7.4.2 無用功 59
7.4.3 重復(fù)性工作 60
7.5 優(yōu)化和解題技巧 2:親力親為 61
7.6 優(yōu)化和解題技巧 3:化繁為簡(jiǎn) 62
7.7 優(yōu)化和解題技巧 4:由淺入深 62
7.8 優(yōu)化和解題技巧 5:數(shù)據(jù)結(jié)構(gòu)頭腦風(fēng)暴法 63
7.9 可想象的極限運(yùn)行時(shí)間 63
7.10 處理錯(cuò)誤答案 66
7.11 做過的面試題 66
7.12 面試的完美語言 67
7.12.1 流行度 67
7.12.2 語言可讀性 67
7.12.3 潛在問題 67
7.12.4 冗長(zhǎng) 67
7.12.5 易用性 68
7.13 好代碼的標(biāo)準(zhǔn) 68
7.13.1 多多使用數(shù)據(jù)結(jié)構(gòu) 68
7.13.2 適當(dāng)代碼復(fù)用 69
7.13.3 模塊化 70
7.13.4 靈活性和通用性 70
7.13.5 錯(cuò)誤檢查 71
7.14 不要輕言放棄 71
第 8 章 錄用通知及其他注意事項(xiàng) 72
8.1 如何處理錄用與被拒的情況 72
8.1.1 回復(fù)期限與延長(zhǎng)期限 72
8.1.2 如何拒絕錄用通知 72
8.1.3 如何處理被拒 72
8.2 如何評(píng)估錄用待遇 73
8.2.1 薪酬待遇的考量 73
8.2.2 職業(yè)發(fā)展 73
8.2.3 公司穩(wěn)定性 73
8.2.4 幸福指數(shù) 74
8.3 錄用談判 74
8.4 入職須知 75
8.4.1 制定時(shí)間表 75
8.4.2 打造堅(jiān)實(shí)的人際網(wǎng)絡(luò) 75
8.4.3 向經(jīng)理尋求幫助 75
8.4.4 保持面試狀態(tài) 75
第 9 章 面試題目 76
9.1 數(shù)組與字符串 76
9.1.1 散列表 76
9.1.2 ArrayList與可變長(zhǎng)度數(shù)組 77
9.1.3 StringBuilder 77
9.2 鏈表 79
9.2.1 創(chuàng)建鏈表 79
9.2.2 刪除單向鏈表中的節(jié)點(diǎn) 80
9.2.3 快行指針技巧 80
9.2.4 遞歸問題 81
9.3 棧與隊(duì)列 82
9.3.1 實(shí)現(xiàn)一個(gè)!82
9.3.2 實(shí)現(xiàn)一個(gè)隊(duì)列 83
9.4 樹與圖 85
9.4.1 樹的類型 85
9.4.2 二叉樹的遍歷 87
9.4.3 二叉堆(小頂堆與大頂堆) 88
9.4.4 單詞查找樹(前序樹) 89
9.4.5 圖 90
9.4.6 圖的搜索 91
9.5 位操作 94
9.5.1 手工位操作 95
9.5.2 位操作原理與技巧 95
9.5.3 二進(jìn)制補(bǔ)碼與負(fù)數(shù) 95
9.5.4 算術(shù)右移與邏輯右移 96
9.5.5 常見位操作:獲取與設(shè)置數(shù)位 97
9.6 數(shù)學(xué)與邏輯題 99
9.6.1 素?cái)?shù) 99
9.6.2 概率 101
9.6.3 大聲說出你的思路 102
9.6.4 總結(jié)規(guī)律和模式 102
9.6.5 略作變通 103
9.6.6 觸類旁通 104
9.7 面向?qū)ο笤O(shè)計(jì) 105
9.7.1 如何解答 105
9.7.2 設(shè)計(jì)模式 106
9.8 遞歸與動(dòng)態(tài)規(guī)劃 108
9.8.1 解題思路 109
9.8.2 遞歸與迭代 109
9.8.3 動(dòng)態(tài)規(guī)劃及記憶法 109
9.9 系統(tǒng)設(shè)計(jì)與可擴(kuò)展性 114
9.9.1 處理問題 114
9.9.2 循環(huán)漸進(jìn)的設(shè)計(jì) 114
9.9.3 逐步構(gòu)建的方法:循序漸進(jìn) 116
9.9.4 關(guān)鍵概念 116
9.9.5 系統(tǒng)設(shè)計(jì)要考慮的因素 118
9.9.6 人無完人,系統(tǒng)亦然 119
9.9.7 實(shí)例演示 119
9.10 排序與查找 121
9.10.1 常見的排序算法 121
9.10.2 查找算法 124
9.11 測(cè)試 126
9.11.1 面試官想考查什么 126
9.11.2 測(cè)試現(xiàn)實(shí)生活中的事物 127
9.11.3 測(cè)試一套軟件 127
9.11.4 測(cè)試一個(gè)函數(shù) 129
9.11.5 調(diào)試與故障排除 129
9.12 C和C 131
9.12.1 類和集成 131
9.12.2 構(gòu)造函數(shù)和析構(gòu)函數(shù) 131
9.12.3 虛函數(shù) 132
9.12.4 虛析構(gòu)函數(shù) 133
9.12.5 默認(rèn)值 134
9.12.6 操作符重載 134
9.12.7 指針和引用 134
9.12.8 模板 135
9.13 Java 136
9.13.1 如何處理 137
9.13.2 重載與重寫 137
9.13.3 集合框架 138
9.14 數(shù)據(jù)庫 139
9.14.1 SQL語法及各類變體 139
9.14.2 規(guī)范化數(shù)據(jù)庫和非規(guī)范化數(shù)據(jù)庫 139
9.14.3 SQL語句 140
9.14.4 小型數(shù)據(jù)庫設(shè)計(jì) 141
9.14.5 大型數(shù)據(jù)庫設(shè)計(jì) 142
9.15 線程與鎖 143
9.15.1 Java線程 143
9.15.2 同步和鎖 145
9.15.3 死鎖及死鎖的預(yù)防 148
9.16 中等難題 149
9.17 高難度題 152
第 10 章 題目解法 156
10.1 數(shù)組與字符串 156
10.2 鏈表 170
10.3 棧與隊(duì)列 186
10.4 樹與圖 197
10.5 位操作 229
10.6 數(shù)學(xué)與邏輯題 240
10.7 面向?qū)ο笤O(shè)計(jì) 254
10.8 遞歸與動(dòng)態(tài)規(guī)劃 286
10.9 系統(tǒng)設(shè)計(jì)與可擴(kuò)展性 313
10.10 排序與查找 332
10.11 測(cè)試 350
10.12 C和C 354
10.13 Java 363
10.14 數(shù)據(jù)庫 370
10.15 線程與鎖 375
10.16 中等難題 388
10.17 高難度題 450
第 11 章 進(jìn)階話題 539
11.1 實(shí)用數(shù)學(xué) 539
11.1.1 整數(shù)1至N的和 540
11.1.2 2的冪的和 540
11.1.3 對(duì)數(shù)的底 542
11.1.4 排列 541
11.1.5 組合 541
11.1.6 歸納證明 541
11.2 拓?fù)渑判颉?42
11.3 Dijkstra算法 543
11.4 散列表沖突解決方案 545
11.4.1 使用鏈表連接數(shù)據(jù) 545
11.4.2 使用二叉搜索樹連接數(shù)據(jù) 546
11.4.3 使用線性探測(cè)進(jìn)行開放尋址 546
11.4.4 平方探測(cè)和雙重散列 546
11.5 Rabin-Karp子串查找 546
11.6 AVL樹 547
11.6.1 性質(zhì) 547
11.6.2 插入操作 547
11.7 紅黑樹 548
11.7.1 性質(zhì) 549
11.7.2 為什么這樣的樹是平衡的 549
11.7.3 插入操作 549
11.8 MapReduce 551
11.9 補(bǔ)充學(xué)習(xí)內(nèi)容 553
附錄 A 代碼庫 554
附錄 B 提示 560