前言
對工程師而言,算法既是基礎能力,也是進階突破的必備能力。
本文內容深入淺出,不僅涉及算法知識本身,更能讓讀者解決問題的思維升級。不論是面試準備,還是日常學習,本文都可以成爲你進入算法世界的不二選擇。
相比在網上泛泛地刷題,本文更強調最優解和舉一反三的能力。對算法原型的介紹也能幫助程序員更高效地準備面試與提升自己,以及在不斷變化的題目中迅速找到思路。
也是程序員求職或跳槽刷題人的優選之作!作者用豐富的工作經驗和對算法的深刻理解,通過精闢的示例,把代碼面試題目最優解解釋得簡明和“平易近人”。
本文中,作者通過自己對常見算法知識的理解,精心選擇了一道道真實的高頻面試題,循序漸進地提升題目難度,輔以翔實的解題思路,讓讀者真正學得到內容,並學得下去。
本文將從目錄、主要內容、專家大牛對本文的評價、相比第1版有哪些改進四部分給大家介紹,希望大家能夠把裏面的內容全部掌握,並且能夠學以致用,也希望能夠得到大家的喜歡!github地址:https://github.com/Java-xiaoluo/Java-note
目錄
主要內容
本文是程序員代碼面試寶典!文中對IT名企代碼面試各類題目的最優解進行了總結,並提供了相關代碼實現。
第1章棧和隊列,設計一個有getMin功能的棧
由兩個棧組成的隊列
如何僅用遞歸函數和棧操作逆序一個棧
貓狗隊列
用一個棧實現另一個棧的排序
用棧來求解漢諾塔問題
生成窗口最大值數組
單調棧結構
求最大子矩陣的大小
最大值減去最小值小於或等於num的子數組數量
可見的山峯對數量
第2章鏈表問題,
打印兩個有序鏈表的公共部分
在單鏈表和雙鏈表中刪除倒數第K個節點
刪除鏈表的中間節點和a/b處的節點
反轉單向和雙向鏈表
反轉部分單向鏈表
環形單鏈表的約瑟夫問題
判斷一個鏈表是否爲迴文結構(普通解法 進階解法尉)
將單向鏈表按某值劃分成左邊小、中間相等、右邊大的形式
複製含有隨機指針節點的鏈表
兩個單鏈表生成相加鏈表
兩個單鏈表相交的一系列問題
將單鏈表的每K個節點之間逆序
刪除無序單鏈表中值重複出現的節點
在單鏈表中刪除指定值的節點
將搜索二叉樹轉換成雙向鏈表
單鏈表的選擇排序
一種怪異的節點刪除方式
向有序的環形單鏈表中插入新節點
合併兩個有序的單鏈表
按照左右半區的方式重新組合單鏈表
第3章二叉樹問題,
分別用遞歸和非遞歸方式實現二叉樹先序、中序和後序遍歷
打印二叉樹的邊界節點
如何較爲直觀地打印二叉樹
二叉樹的序列化和反序列化
遍歷二叉樹的神級方法
在二叉樹中找到累加和爲指定值的最長路徑長度
找到二叉樹中的最大搜索二叉子樹
找到二叉樹中符合搜索二叉樹條件的最大拓撲結構
二叉樹的按層打印與ZigZag打印
調整搜索二叉樹中兩個錯誤的節點
判斷t1樹是否包含t2樹全部的拓撲結構
判斷t1樹中是否有與t2樹拓撲結構完全相同的子樹
判斷二叉樹是否爲平衡二叉樹
根據後序數組重建搜索二叉樹
判斷- -棵二叉樹是否爲搜索二叉樹和完全二叉樹
通過有序數組生成平衡搜索二叉樹
在二叉樹中找到一個節點的後繼節點
在二叉樹中找到兩個節點的最近公共祖先
Tarjan算法與並查集解決二叉樹節點間最近公共祖先的批量查詢問題
二叉樹節點間的最大距離問題
派對的最大快樂值
通過先序和中序數組生成後序數組
統計和生成所有不同的二叉樹
統計完全二叉樹的節點數
第4章遞歸和動態規劃,斐波那契數列問題的遞歸和動態規劃
矩陣的最小路徑和
換錢的最少貨幣數
機器人達到指定位置方法數
換錢的方法數
打氣球的最大分數
最長遞增子序列
信封嵌套問題
漢諾塔問題
最長公共子序列問題
最長公共子串問題
子數組異或和爲0的最多劃分
最小編輯代價
字符串的交錯組成
龍與地下城遊戲問題
數字字符串轉換爲字母組合的種數
表達式得到期望結果的組成種數
排成一條線的紙牌博弈問題
跳躍遊戲
數組中的最長連續序列
N皇后問題
第5章字符串問題.判斷兩個字符串是否互爲變形詞;
判斷兩個字符串是否互爲旋轉詞
將整數字符串轉成整數值
字符串的統計字符串
判斷字符數組中是否所有的字符都只出現過一- 次
在有序但含有空的數組中查找字符串
字符串的調整與替換
翻轉字符串
完美洗牌問題
刪除多餘字符得到字典序最小的字符串
數組中兩個字符串的最小距離
字符串的轉換路徑問題
添加最少字符使字符串整體都是迴文字符串
括號字符串的有效性和最長有效長度
公式字符串求值
0左邊必有1的二進制字符串數量
拼接所有字符串產生字典順序最小的大寫字符串
找到字符串的最長無重複字符子串
找到指定的新類型字符
旋變字符串問題
最小包含子串的長度
迴文最少分割數
字符串匹配問題
字典樹(前綴樹)的實現
子數組的最大異或和
第6章大數據和空間限制,認識布隆過濾器
只用2GB內存在20億個整數中找到出現次數最多的數
40億個非負整數中找到未出現的數
找到100億個URL中重複的URL及搜索詞彙的TopK問題
40億個非負整數中找到出現兩次的數和所有數的中位數
一致性哈希算法的基本原理
島問題
第7章位運算,不用額外變量交換兩個整數的值
不用做任何比較判斷找出兩個數中較大的數
只用位運算不用算術運算實現整數的加減乘除運算
整數的二進制數表達中有多少個1
在其他數都出現偶數次的數組中找到出現奇數次的數
在其他數都出現k次的數組中找到只出現一次的數
第8章數組和矩陣問題,轉圈打印矩陣
將正方形矩陣順時針轉動90°
“之”字形打印矩陣
找到無序數組中最小的k個數
需要排序的最短子數組長度
在數組中找到出現次數大於N/K的數
在行列都排好序的矩陣中找指定數
最長的可整合子數組的長度
不重複打印排序數組中相加和爲給定值的所有二元組和三元組
未排序正數數組中累加和爲給定值的最長子數組長度
未排序數組中累加和爲給定值的最長子數組系列問題
未排序數組中累加和小於或等於給定值的最長子數組長度
計算數組的小和
自然數數組的排序
奇數下標都是奇數或者偶數下標都是偶數
子數組的最大累加和問題
子矩陣的最大累加和問題
在數組中找到一一個局部最小的位置
數組中子數組的最大累乘積
打印N個數組整體最大的TopK
邊界都是1的最大正方形大小
不包含本位置值的累乘數組
數組的partition 調整
求最短通路值
數組中未出現的最小正整數
數組排序之後相鄰數的最大差
做項目的最大收益問題
分金條的最小花費
大樓輪廓問題
加油站良好出發點問題
容器盛水問題
第9章其他題目,從5隨機到7隨機及其擴展,(原問題尉,補充問題,進階問題
一行代碼求兩個數的最大公約數
有關階乘的兩個問題
判斷一個點是否在矩形內部
判斷一個點是否在三角形內部
摺紙問題
能否完美地拼成矩形
蓄水池算法
設計有setAll功能的哈希表
最大的leftMax與rightMax 之差的絕對值
設計LRU緩存結構
LFU緩存結構設計
設計RandomPool結構
並查集的實現
調整[0,x)區間上的數出現的概率
路徑數組變爲統計數組
正數數組的最小不可組成和
累加出整個範圍所有的數最少還需幾個數
一種字符串和數字的對應關係
1到n中 1出現的次數
從N個數中等概率打印M個數
判斷一個數是否是迴文數
在有序旋轉數組中找到最小值
在有序旋轉數組中找到一個數
數字的英文表達和中文表達
分糖果問題
一種消息接收並打印的結構設計
隨時找到數據流的中位數
在兩個長度相等的排序數組中找到上中位數
在兩個排序數組中找到第k小的數
兩個有序數組間相加和的Topk問題
出現次數的Topk問題
Manacher算法
KMP算法
丟棋子問題
畫匠問題
郵局選址問題
這份【程序員代碼面試指南: IT 名企算法與數據結構題目最優解(第2版)】共有578頁,需要完整版的朋友,可以轉發此文關注小編,github地址:https://github.com/Java-xiaoluo/Java-note
總結
一、來看一下大牛對本文的高度評價!
二、相比第一版的內容,第2版有什麼新的內容增加或者修改呢?
1.修改了第1版部分題目的解釋,並增加了更多示例。
2.增加了很多近年來新出現的流行面試題,刪掉了已經很少出現的低頻面試題。
3.把經常出現的解題套路與算法原型做了結構化的調整和總結。
4.本文所有題目的代碼都用Java語言實現,但這並不會妨礙其他語言使用者的閱讀。
這是因爲筆者盡最大努力迴避了與Java語言特性相關的代碼實現,而且儘量遵循大多數編程語言共有的寫法習慣。因此,將本書中的Java語言實現改寫成其他語言的實現是非常容易的。
5.在Java語言中,如果想得到字符串str第i個位置的字符,則需用如下方式:
char p = str.charAt(i);
本文提供的函數中有大量參數爲字符串類型的函數,但如上所示的方式並不符合大多數讀者的閱讀習慣。爲了讓代碼更加易讀,筆者在這些函數中把字符串類型的參數轉換成char類型數組的變量來使用。例如:
char] charArr = str.toCharArray();
此時得到字符串str第i個位置的字符,可以用如下方式:
char p = charArr[i];
在本文中,發生如上轉換行爲的函數在估算額外空間複雜度時,筆者並沒有把charArr的空間計算在內,這是因爲如果不轉換成char數組,而是選擇直接使用原參數str,也是完全可以的,之所以選擇轉換,僅僅是爲了讓讀者更容易讀懂代碼;是否進行轉換對算法的邏輯沒有任何影響,所以不把charArr的空間算作必須使用的額外空間。