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