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