《C#程序員面試算法寶典》是一本講解程序員面試筆試算法的書籍,代碼采用C#語言進(jìn)行編寫,在寫法上,除了講解如何解答算法問題以外,還引入了實例輔以說明,讓讀者能夠更加容易地理解。
《C#程序員面試算法寶典》將程序員面試筆試過程中典型算法類真題盡收囊中,在題目的廣度上,通過各種渠道,搜集了近3年來幾乎所有IT企業(yè)面試筆試算法高頻題目,所選擇題目均為企業(yè)招聘使用的真題。在題目的深度上,本書由淺入深,細(xì)致地分析每一個題目,并提煉歸納。本書結(jié)構(gòu)合理,條理清晰,對于讀者進(jìn)行學(xué)習(xí)與檢索意義重大。
《C#程序員面試算法寶典》可作為計算機相關(guān)專業(yè)畢業(yè)生面試筆試的求職用書,也可以作為本科生、研究生學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法的輔導(dǎo)書籍,同時也適合期望在計算機軟硬件行業(yè)大顯身手的計算機愛好者閱讀。
前言
面試筆試經(jīng)驗技巧篇
經(jīng)驗技巧1 如何巧妙地回答面試官的問題2
經(jīng)驗技巧2 如何回答技術(shù)性的問題3
經(jīng)驗技巧3 如何回答非技術(shù)性問題5
經(jīng)驗技巧4 如何回答快速估算類問題5
經(jīng)驗技巧5 如何回答算法設(shè)計問題6
經(jīng)驗技巧6 如何回答系統(tǒng)設(shè)計題9
經(jīng)驗技巧7 如何解決求職中的時間沖突問題11
經(jīng)驗技巧8 如果面試問題曾經(jīng)遇見過,是否要告知12
經(jīng)驗技巧9 被企業(yè)拒絕后是否可以再申請13
經(jīng)驗技巧10 如何應(yīng)對自己不會回答的問題13
經(jīng)驗技巧11 如何應(yīng)對面試官的“激將法”語言14
經(jīng)驗技巧12 如何處理與面試官持不同觀點的問題15
經(jīng)驗技巧13 什么是職場暗語15
面試筆試真題解析篇
第1章 鏈表21
1.1 如何實現(xiàn)鏈表的逆序22
1.2 如何從無序鏈表中移除重復(fù)項26
1.3 如何計算兩個單鏈表所代表的數(shù)之和30
1.4 如何對鏈表進(jìn)行重新排序33
1.5 如何找出單鏈表中的倒數(shù)第k個元素36
1.6 如何檢測一個較大的單鏈表是否有環(huán)40
1.7 如何把鏈表相鄰元素翻轉(zhuǎn)43
1.8 如何把鏈表以k個結(jié)點為一組進(jìn)行翻轉(zhuǎn)45
1.9 如何合并兩個有序鏈表48
1.10 如何在只給定單鏈表中某個結(jié)點的指針的情況下刪除該結(jié)點51
1.11 如何判斷兩個單鏈表(無環(huán))是否交叉53
第2章 棧與隊列57
2.1 如何實現(xiàn)棧57
2.2 如何實現(xiàn)隊列62
2.3 如何翻轉(zhuǎn)棧的所有元素68
2.4 如何根據(jù)入棧序列判斷可能的出棧序列72
2.5 如何用O(1)的時間復(fù)雜度求棧中最小元素74
2.6 如何用兩個棧模擬隊列操作76
2.7 如何設(shè)計一個排序系統(tǒng)77
2.8 如何實現(xiàn)LRU緩存方案79
2.9 如何從給定的車票中找出旅程的路線81
2.10 如何從數(shù)組中找出滿足a+b=c+d的兩個數(shù)對83
第3章 二叉樹86
3.1 二叉樹基礎(chǔ)知識86
3.2 如何把一個有序整數(shù)數(shù)組放到二叉樹中88
3.3 如何從頂部開始逐層遍歷二叉樹結(jié)點數(shù)據(jù)90
3.4 如何求一棵二叉樹的最大子樹的和92
3.5 如何判斷兩棵二叉樹是否相等94
3.6 如何把二叉樹轉(zhuǎn)換為雙向鏈表95
3.7 如何判斷一個數(shù)組是否是二元查找樹后序遍歷的序列97
3.8 如何找出排序二叉樹上任意兩個結(jié)點的最近共同父結(jié)點99
3.9 如何復(fù)制二叉樹105
3.10 如何在二叉樹中找出與輸入整數(shù)相等的所有路徑106
3.11 如何對二叉樹進(jìn)行鏡像反轉(zhuǎn)108
3.12 如何在二叉排序樹中找出第一個大于中間值的結(jié)點110
3.13 如何在二叉樹中找出路徑最大的和113
3.14 如何實現(xiàn)反向DNS查找緩存115
第4章 數(shù)組119
4.1 如何找出數(shù)組中唯一的重復(fù)元素119
4.2 如何查找數(shù)組中元素的最大值和最小值126
4.3 如何找出旋轉(zhuǎn)數(shù)組的最小元素130
4.4 如何找出數(shù)組中出現(xiàn)奇數(shù)次的數(shù)133
4.5 如何找出數(shù)組中第k小的數(shù)136
4.6 如何求數(shù)組中兩個元素的最小距離140
4.7 如何求解最小三元組距離142
4.8 如何求數(shù)組中絕對值最小的數(shù)147
4.9 如何求數(shù)組連續(xù)最大和151
4.10 如何找出數(shù)組中出現(xiàn)1次的數(shù)155
4.11 如何在不排序的情況下求數(shù)組中的中位數(shù)158
4.12 如何求集合的所有子集159
4.13 如何對數(shù)組進(jìn)行循環(huán)移位163
4.14 如何求解迷宮問題166
4.15 如何求解數(shù)組分為和相等的m份后m最大值問題168
4.16 如何求一個數(shù)組的最長遞減子序列170
4.17 如何求解和為n的連續(xù)正數(shù)序列173
4.18 如何尋找丑數(shù)175
4.19 如何找到數(shù)組元素連接起來排成的所有數(shù)字中最小的一個178
4.20 如何找出數(shù)組中出現(xiàn)次數(shù)超過了一半的那個數(shù)字179
4.21 如何找出數(shù)組中左邊的數(shù)都小于等于它,右邊的數(shù)都大于等于它的數(shù)180
4.22 如何進(jìn)行大整數(shù)相乘182
4.23 如何求集合的所有子集184
4.24 如何知道拿走了哪個數(shù)186
4.25 如何求解n-m問題187
4.26 如何求2個有序數(shù)組合并后的中位數(shù)188
4.27 如何找出n個整數(shù)中最小的k個數(shù)190
4.28 如何求解數(shù)組中逆序?qū)Φ膫數(shù)192
4.29 如何找出數(shù)組的峰值194
4.30 如何找出數(shù)組中的乘積最大子序列195
4.31 如何對數(shù)組進(jìn)行旋轉(zhuǎn)196
4.32 如何求數(shù)組的最大子數(shù)組差199
4.33 如何統(tǒng)計比給定整數(shù)小的數(shù)的個數(shù)201
4.34 如何進(jìn)行搖擺排序203
4.35 如何求解數(shù)組排序前后最大的間隔204
4.36 如何找出和最接近0的子數(shù)組206
4.37 如何找出數(shù)組中和為指定值的四元組208
4.38 如何計算買股票的最佳時間210
4.39 如何確定出發(fā)加油站問題211
第5章 字符串213
5.1 如何求一個字符串的所有排列213
5.2 如何求兩個字符串的最長公共子串219
5.3 如何判斷兩個字符串是否為換位字符串222
5.4 如何判斷兩個字符串的包含關(guān)系224
5.5 如何對由大小寫字母組成的字符數(shù)組排序227
5.6 如何消除字符串的內(nèi)嵌括號228
5.7 如何判斷字符串是否是整數(shù)229
5.8 如何實現(xiàn)字符串的匹配232
5.9 如何求字符串的編輯距離236
5.10 如何查找到達(dá)目標(biāo)詞的最短鏈長度238
5.11 如何左旋轉(zhuǎn)字符串241
5.12 如何在一個字符串中找到第一個只出現(xiàn)一次的字符242
5.13 如何找出字符串中連續(xù)最長的數(shù)字串243
5.14 如何進(jìn)行字符串的串聯(lián)244
5.15 如何從一個字符串中刪除另一個字符串的所有的字符246
5.16 如何判斷字符串A中是否包含由字符串B中字符重新排列成的新字符串248
5.17 如何進(jìn)行子串查找250
5.18 如何實現(xiàn)字符串的替換252
5.19 如何進(jìn)行通配符匹配254
5.20 如何解決字符串包含問題255
5.21 如何求解最小子串覆蓋問題257
5.22 如何找出字符串的最長公共前綴258
5.23 如何找到數(shù)組刪除k個數(shù)字之后的最小正整數(shù)259
5.24 如何查找沒有重復(fù)字符的最長子串260
第6章 數(shù)字262
6.1 如何不使用庫函數(shù)求解整數(shù)x的平方根262
6.2 如何進(jìn)行骰子求和263
6.3 如何求解最多有多少個點在一條直線上的問題266
6.4 如何進(jìn)行數(shù)字的二進(jìn)制翻轉(zhuǎn)267
6.5 如何把數(shù)字轉(zhuǎn)換為二進(jìn)制268
6.6 如何進(jìn)行指數(shù)運算270
6.7 如何查找連續(xù)數(shù)字中某個數(shù)字出現(xiàn)的次數(shù)271
6.8 如何反轉(zhuǎn)整數(shù)273
6.9 如何判斷一個數(shù)字是否是回文數(shù)274
6.10 如何判斷一個自然數(shù)是否是某個數(shù)的二次方274
6.11 如何判斷一個數(shù)是否為2的n次方277
6.12 如何根據(jù)已知隨機數(shù)生成函數(shù)計算新的隨機數(shù)278
6.13 如何判斷1024!末尾有多少個0280
6.14 如何求有序數(shù)列的第1500個數(shù)的值281
6.15 如何求二進(jìn)制數(shù)中1的個數(shù)282
6.16 如何找出最小的不重復(fù)數(shù)283
6.17 如何計算一個數(shù)的n次方287
第7章 大數(shù)據(jù)291
7.1 如何從大量的url中找出相同的url291
7.2 如何從大量數(shù)據(jù)中找出高頻詞292
7.3 如何找出訪問百度最多的IP293
7.4 如何在大量的數(shù)據(jù)中找出不重復(fù)的整數(shù)293
7.5 如何查詢最熱門的查詢串294
7.6 如何統(tǒng)計不同電話號碼的個數(shù)295
7.7 如何從5億個數(shù)中找出中位數(shù)296
7.8 如何按照query的頻度排序297
7.9 如何找出排名前500的數(shù)298
第8章 排序302
8.1 如何進(jìn)行選擇排序302
8.2 如何進(jìn)行插入排序303
8.3 如何進(jìn)行冒泡排序304
8.4 如何進(jìn)行歸并排序306
8.5 如何進(jìn)行快速排序308
8.6 如何進(jìn)行希爾排序310
8.7 如何進(jìn)行堆排序312
8.8 各種排序算法有什么優(yōu)劣313
第9章 排列組合與概率315
9.1 如何求數(shù)字的組合315
9.2 如何拿到最多金幣317
9.3 如何求正整數(shù)n所有可能的整數(shù)組合319
9.4 如何用一個隨機函數(shù)得到另外一個隨機函數(shù)321
9.5 如何等概率地從大小為n的數(shù)組中選取m個整數(shù)322
9.6 如何組合1、2、5這三個數(shù)使其和為100323
9.7 如何判斷還有幾盞燈泡亮著325