《Kotlin程序員面試算法寶典》是一本講解程序員面試筆試算法的書(shū)籍。在寫(xiě)法上,除了講解如何解答算法問(wèn)題以外,還引入了例子輔以說(shuō)明,以便讀者能夠更加容易地理解。
《Kotlin程序員面試算法寶典》將程序員面試筆試過(guò)程中的各類(lèi)算法類(lèi)真題一網(wǎng)打盡。在題目的廣度上,通過(guò)各種渠道,搜集了近3年來(lái)幾乎所有IT企業(yè)面試筆試算法高頻題目,所選擇題目均為企業(yè)招聘使用題目;在題目的深度上,本書(shū)由淺入深、庖丁解牛式地分析每一個(gè)題目,并提煉歸納,同時(shí),引入例子與源代碼、時(shí)間復(fù)雜度與空間復(fù)雜度的分析,這些內(nèi)容是其他同類(lèi)書(shū)籍所沒(méi)有的。本書(shū)結(jié)構(gòu)合理,條理清晰,根據(jù)真題所屬知識(shí)點(diǎn)進(jìn)行分類(lèi),對(duì)于讀者進(jìn)行學(xué)習(xí)與檢索意義重大。
《Kotlin程序員面試算法寶典》是一本計(jì)算機(jī)相關(guān)專(zhuān)業(yè)畢業(yè)生面試筆試的求職用書(shū),也可以作為本科生、研究生學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的輔導(dǎo)書(shū)籍,同時(shí)也適合期望在計(jì)算機(jī)軟硬件行業(yè)大顯身手的計(jì)算機(jī)愛(ài)好者閱讀。
前言
面試筆試經(jīng)驗(yàn)技巧篇
經(jīng)驗(yàn)技巧1 如何巧妙地回答面試官的問(wèn)題2
經(jīng)驗(yàn)技巧2 如何回答技術(shù)性問(wèn)題3
經(jīng)驗(yàn)技巧3 如何回答非技術(shù)性問(wèn)題4
經(jīng)驗(yàn)技巧4 如何回答快速估算類(lèi)問(wèn)題5
經(jīng)驗(yàn)技巧5 如何回答算法設(shè)計(jì)問(wèn)題6
經(jīng)驗(yàn)技巧6 如何回答系統(tǒng)設(shè)計(jì)問(wèn)題8
經(jīng)驗(yàn)技巧7 如何解決求職中的時(shí)間沖突問(wèn)題11
經(jīng)驗(yàn)技巧8 如果面試問(wèn)題曾經(jīng)遇見(jiàn)過(guò),是否要告知面試官12
經(jīng)驗(yàn)技巧9 被企業(yè)拒絕后是否可以再申請(qǐng)12
經(jīng)驗(yàn)技巧10 如何應(yīng)對(duì)自己不會(huì)回答的問(wèn)題13
經(jīng)驗(yàn)技巧11 如何應(yīng)對(duì)面試官的激將法語(yǔ)言13
經(jīng)驗(yàn)技巧12 如何處理與面試官持不同觀點(diǎn)的問(wèn)題14
經(jīng)驗(yàn)技巧13 什么是職場(chǎng)暗語(yǔ)15
面試筆試真題解析篇
第1章 鏈表20
1.1 如何實(shí)現(xiàn)鏈表的逆序20
1.2 如何從無(wú)序鏈表中移除重復(fù)項(xiàng)25
1.3 如何計(jì)算兩個(gè)單鏈表所代表的數(shù)之和28
1.4 如何對(duì)鏈表進(jìn)行重新排序32
1.5 如何找出單鏈表中的倒數(shù)第k個(gè)元素35
1.6 如何檢測(cè)一個(gè)較大的單鏈表是否有環(huán)38
1.7 如何把鏈表相鄰元素翻轉(zhuǎn)41
1.8 如何把鏈表以K個(gè)結(jié)點(diǎn)為一組進(jìn)行翻轉(zhuǎn)43
1.9 如何合并兩個(gè)有序鏈表46
1.10 如何在只給定單鏈表中某個(gè)結(jié)點(diǎn)的指針的情況下刪除該結(jié)點(diǎn)48
1.11 如何判斷兩個(gè)單鏈表(無(wú)環(huán))是否交叉50
1.12 如何展開(kāi)鏈接列表54
第2章 棧、隊(duì)列與哈希57
2.1 如何實(shí)現(xiàn)棧57
2.2 如何實(shí)現(xiàn)隊(duì)列61
2.3 如何翻轉(zhuǎn)棧的所有元素66
2.4 如何根據(jù)入棧序列判斷可能的出棧序列69
2.5 如何用O(1)的時(shí)間復(fù)雜度求棧中最小元素71
2.6 如何用兩個(gè)棧模擬隊(duì)列操作73
2.7 如何設(shè)計(jì)一個(gè)排序系統(tǒng)74
2.8 如何實(shí)現(xiàn)LRU緩存方案76
2.9 如何從給定的車(chē)票中找出旅程77
2.10 如何從數(shù)組中找出滿足a b=c d的兩個(gè)數(shù)對(duì)79
第3章 二叉樹(shù)81
3.1 二叉樹(shù)基礎(chǔ)知識(shí)81
3.2 如何把一個(gè)有序整數(shù)數(shù)組放到二叉樹(shù)中82
3.3 如何從頂部開(kāi)始逐層打印二叉樹(shù)結(jié)點(diǎn)數(shù)據(jù)84
3.4 如何求一棵二叉樹(shù)的最大子樹(shù)和86
3.5 如何判斷兩棵二叉樹(shù)是否相等88
3.6 如何把二叉樹(shù)轉(zhuǎn)換為雙向鏈表90
3.7 如何判斷一個(gè)數(shù)組是否是二元查找樹(shù)后序遍歷的序列92
3.8 如何找出排序二叉樹(shù)上任意兩個(gè)結(jié)點(diǎn)的最近共同父結(jié)點(diǎn)93
3.9 如何復(fù)制二叉樹(shù)100
3.10 如何在二叉樹(shù)中找出與輸入整數(shù)相等的所有路徑101
3.11 如何對(duì)二叉樹(shù)進(jìn)行鏡像反轉(zhuǎn)103
3.12 如何在二叉排序樹(shù)中找出第一個(gè)大于中間值的結(jié)點(diǎn)105
3.13 如何在二叉樹(shù)中找出路徑最大的和108
3.14 如何實(shí)現(xiàn)反向DNS查找緩存109
第4章 數(shù)組113
4.1 如何找出數(shù)組中唯一的重復(fù)元素113
4.2 如何查找數(shù)組中元素的最大值和最小值119
4.3 如何找出旋轉(zhuǎn)數(shù)組中的最小元素122
4.4 如何找出數(shù)組中丟失的數(shù)125
4.5 如何找出數(shù)組中出現(xiàn)奇數(shù)次的數(shù)127
4.6 如何找出數(shù)組中第k小的數(shù)130
4.7 如何求數(shù)組中兩個(gè)元素的最小距離133
4.8 如何求解最小三元組距離135
4.9 如何求數(shù)組中絕對(duì)值最小的數(shù)140
4.10 如何求數(shù)組連續(xù)最大和143
4.11 如何找出數(shù)組中出現(xiàn)1次的數(shù)147
4.12 如何對(duì)數(shù)組旋轉(zhuǎn)149
4.13 如何在不排序的情況下求數(shù)組中的中位數(shù)151
4.14 如何求集合的所有子集152
4.15 如何對(duì)數(shù)組進(jìn)行循環(huán)移位155
4.16 如何在有規(guī)律的二維數(shù)組中進(jìn)行高效的數(shù)據(jù)查找158
4.17 如何尋找最多的覆蓋點(diǎn)160
4.18 如何判斷請(qǐng)求能否在給定的存儲(chǔ)條件下完成161
4.19 如何按要求構(gòu)造新的數(shù)組163
4.20 如何獲取最好的矩陣鏈相乘方法165
4.21 如何求解迷宮問(wèn)題167
4.22 如何從三個(gè)有序數(shù)組中找出它們的公共元素169
4.23 如何求兩個(gè)有序集合的交集171
4.24 如何對(duì)有大量重復(fù)數(shù)字的數(shù)組排序174
4.25 如何對(duì)任務(wù)進(jìn)行調(diào)度178
4.26 如何對(duì)磁盤(pán)分區(qū)179
第5章 字符串181
5.1 如何求一個(gè)字符串的所有排列181
5.2 如何求兩個(gè)字符串的最長(zhǎng)公共子串187
5.3 如何對(duì)字符串進(jìn)行反轉(zhuǎn)190
5.4 如何判斷兩個(gè)字符串是否為換位字符串193
5.5 如何判斷兩個(gè)字符串的包含關(guān)系195
5.6 如何對(duì)由大小寫(xiě)字母組成的字符數(shù)組排序197
5.7 如何消除字符串的內(nèi)嵌括號(hào)198
5.8 如何判斷字符串是否是整數(shù)200
5.9 如何實(shí)現(xiàn)字符串的匹配203
5.10 如何求字符串里的最長(zhǎng)回文子串206
5.11 如何按照給定的字母序列對(duì)字符數(shù)組排序213
5.12 如何判斷一個(gè)字符串是否包含重復(fù)字符215
5.13 如何找到由其他單詞組成的最長(zhǎng)單詞217
5.14 如何統(tǒng)計(jì)字符串中連續(xù)的重復(fù)字符個(gè)數(shù)219
5.15 如何求最長(zhǎng)遞增子序列的長(zhǎng)度220
5.16 求一個(gè)串中出現(xiàn)的第一個(gè)最長(zhǎng)重復(fù)子串222
5.17 如何求解字符串中字典序最大的子序列223
5.18 如何判斷一個(gè)字符串是否由另外一個(gè)字符串旋轉(zhuǎn)得到226
5.19 如何求字符串的編輯距離227
5.20 如何在二維數(shù)組中尋找最短路線230
5.21 如何截取包含中文的字符串232
5.22 如何求相對(duì)路徑234
5.23 如何查找到達(dá)目標(biāo)詞的最短鏈長(zhǎng)度235
第6章 基本數(shù)字運(yùn)算238
6.1 如何判斷一個(gè)自然數(shù)是否是某個(gè)數(shù)的平方238
6.2 如何判斷一個(gè)數(shù)是否為2的n次方240
6.3 如何不使用除法操作符實(shí)現(xiàn)兩個(gè)正整數(shù)的除法241
6.4 如何只使用 操作符實(shí)現(xiàn)加減乘除運(yùn)算246
6.5 如何根據(jù)已知隨機(jī)數(shù)生成函數(shù)計(jì)算新的隨機(jī)數(shù)248
6.6 如何判斷1024!末尾有多少個(gè)0250
6.7 如何按要求比較兩個(gè)數(shù)的大小251
6.8 如何求有序數(shù)列的第1500個(gè)數(shù)的值252
6.9 如何把十進(jìn)制數(shù)(long型)分別以二進(jìn)制和十六進(jìn)制形式輸出253
6.10 如何求二進(jìn)制數(shù)中1的個(gè)數(shù)254
6.11 如何找最小的不重復(fù)數(shù)256
6.12 如何計(jì)算一個(gè)數(shù)的n次方259
6.13 如何在不能使用庫(kù)函數(shù)的條件下計(jì)算n的平方根262
6.14 如何不使用^操作實(shí)現(xiàn)異或運(yùn)算262
6.15 如何不使用循環(huán)輸出1~100264
第7章 排列組合與概率265
7.1 如何求數(shù)字的組合265
7.2 如何拿到最多金幣267
7.3 如何求正整數(shù)n所有可能的整數(shù)組合269
7.4 如何用一個(gè)隨機(jī)函數(shù)得到另外一個(gè)隨機(jī)函數(shù)271
7.5 如何等概率地從大小為n的數(shù)組中選取m個(gè)整數(shù)272
7.6 如何組合1、2和5這三個(gè)數(shù)使其和為100273
7.7 如何判斷有幾盞燈泡還亮著275
第8章 排序277
8.1 如何進(jìn)行選擇排序277
8.2 如何進(jìn)行插入排序278
8.3 如何進(jìn)行冒泡排序280
8.4 如何進(jìn)行歸并排序282
8.5 如何進(jìn)行快速排序285
8.6 如何進(jìn)行希爾排序287
8.7 如何進(jìn)行堆排序289
8.8 各種排序算法有什么優(yōu)劣291
第9章 大數(shù)據(jù)292
9.1 如何從大量的url中找出相同的url292
9.2 如何從大量數(shù)據(jù)中找出高頻詞293
9.3 如何找出訪問(wèn)百度最多的IP294
9.4 如何在大量的數(shù)據(jù)中找出不重復(fù)的整數(shù)294
9.5 如何在大量的數(shù)據(jù)中判斷一個(gè)數(shù)是否存在295
9.6 如何查詢最熱門(mén)的查詢串296
9.7 如何統(tǒng)計(jì)不同電話號(hào)碼的個(gè)數(shù)297
9.8 如何從5億個(gè)數(shù)中找出中位數(shù)298
9.9 如何按照query的頻度排序299
9.10 如何找出排名前500的數(shù)300