程序員代碼面試指南:IT名企算法與數(shù)據(jù)結(jié)構(gòu)題目最優(yōu)解(第2版)(博文視點出品)

2021-04-25 20:44 更新

程序員代碼面試指南:IT名企算法與數(shù)據(jù)結(jié)構(gòu)題目最優(yōu)解(第2版)(博文視點出品)

左程云 著

  • 出版社: 電子工業(yè)出版社
  • ISBN:9787121354861
  • 版次:2
  • 商品編碼:12518392
  • 品牌:博文視點
  • 包裝:平裝
  • 開本:16開
  • 出版時間:2019-01-01
  • 用紙:膠版紙
  • 頁數(shù):576
  • 字數(shù):871000
  • 正文語種:中文


點此購買


編輯推薦

適讀人群 :在讀學(xué)生中,對算法和數(shù)據(jù)結(jié)構(gòu)內(nèi)容有興趣的群體; 想要從事編程方向相關(guān)工作國內(nèi)的本科生、研究生; 想要出國留學(xué),并有計劃畢業(yè)后在國外找工作,從事編程方向相關(guān)工作的留學(xué)生; 已經(jīng)工作,但是對算法和數(shù)據(jù)結(jié)構(gòu)有學(xué)習(xí)興趣的程序員。

如何在IT名企的面試中脫穎而出、一舉成名?這本書就是你應(yīng)該擁有的“神兵利器”。“刷”完本書,你就是“題王”!

對于每一個程序員來說,提升算法和數(shù)據(jù)結(jié)構(gòu)等方面的能力至關(guān)重要。無數(shù)碼農(nóng)和編程愛好者“深陷”題海之中,無論你是為了代碼面試、提升能力而不情愿地刷題,還是愛好所致沉迷于此,這都是你值得擁有的案頭書。

這里有你在別處找不到的至優(yōu)解分析,有高頻出現(xiàn)在IT名氣代碼面試中的真題,有讓人拍案驚嘆巧妙的題目解法,也有讓你工作中的編程難題迎刃而解的啟發(fā)……

第2版說明:

1.修改了第1版部分題目的解釋,并增加了更多示例。

2.增加了很多新出現(xiàn)的流行面試題,刪掉了已經(jīng)過時的低頻面試題。

3.針對解題套路與算法原型做了結(jié)構(gòu)化的調(diào)整和總結(jié)。


內(nèi)容簡介

《程序員代碼面試指南(第2版)》是一本程序員代碼面試寶典!書中對IT名企代碼面試各類題目的至優(yōu)解進行了總結(jié),并提供了相關(guān)代碼實現(xiàn)。針對當(dāng)前程序員面試缺乏題目匯總這一痛點,本書選取將近200道真實出現(xiàn)過的經(jīng)典代碼面試題,幫助廣大程序員做充分的面試準(zhǔn)備。“刷”完本書后,你就是“題王”!

《程序員代碼面試指南(第2版)》采用“題目+解答”的方式組織內(nèi)容,并把面試題類型相近或者解法相近的題目盡量放在一起,讀者在學(xué)習(xí)本書時很容易看出面試題解法之間的聯(lián)系,使知識的學(xué)習(xí)避免碎片化。本書將所有的面試題從難到易依次分為“將”“校”“尉”“士”四個檔次,方便讀者有針對性地選擇“刷”題。本書收錄的所有面試題都給出了至優(yōu)解講解和代碼實現(xiàn),并且提供了一些普通解法和至優(yōu)解法的運行時間對比,讓讀者真切地感受到至優(yōu)解的魅力!

《程序員代碼面試指南:(第2版)》中的題目全面且經(jīng)典,更重要的是,書中收錄了大量新題目和至優(yōu)解分析,這些內(nèi)容源自筆者多年來“死磕自己”的深入思考。

程序員們做好準(zhǔn)備在IT名企的面試中脫穎而出、一舉成名了嗎?《程序員代碼面試指南(第2版)》就是你應(yīng)該擁有的“神兵利器”。當(dāng)然,對需要提升算法和數(shù)據(jù)結(jié)構(gòu)等方面能力的程序員而言,《程序員代碼面試指南(第2版)》的價值也是顯而易見的。


作者簡介

左程云,本科和碩士先后就讀于華中科技大學(xué)和芝加哥大學(xué),在多家國內(nèi)外優(yōu)秀互聯(lián)網(wǎng)公司工作多年。自2010年起專注刷題至今,從2015年開始利用業(yè)余時間在??途W(wǎng)平臺針對代碼面試與算法開始教學(xué)工作。


精彩書評

【精彩書評】

這本書不僅可以作為代碼面試指南,還可以作為學(xué)生與程序員的輔助練習(xí)。作者刷題多年,悉數(shù)總結(jié)沉淀在這本書里。跟著他的引導(dǎo),從頭到尾逐一攻克必有收獲。

——葉向宇 ??途W(wǎng)CEO

對于工程師而言,算法既是基礎(chǔ)能力,也是進階突破的必備能力。本書內(nèi)容深入淺出,不僅涉及算法知識本身,更能讓讀者解決問題的思維升級。不論是面試準(zhǔn)備,還是日常學(xué)習(xí),本書都可以成為你進入算法世界的至優(yōu)選擇。

——葉玎玎 GrowingIO CTO

相比在網(wǎng)上泛泛地刷題,這本書更強調(diào)至優(yōu)解和舉一反三的能力。對算法原型的介紹也能幫助程序員更高效地準(zhǔn)備面試與提升自己,以及在不斷變化的題目中迅速找到思路。

——鞠林 阿里巴巴達摩院人工智能實驗室技術(shù)專家

大部頭的經(jīng)典書人人都買得起,但是卻沒幾個人看得進去。而在本書中,作者通過自己對常見算法知識的理解,精心選擇了一道道真實的高頻面試題,循序漸進地提升題目難度,輔以翔實的解題思路,讓讀者真正學(xué)得到內(nèi)容,并學(xué)得下去。

——徐云釗@imToken 全棧工程師 & 區(qū)塊鏈技術(shù)開發(fā)

此書不僅對準(zhǔn)備面試而刷題的人有幫助,還針對算法流程的優(yōu)化技巧做了多維度的詳盡闡述,在我數(shù)據(jù)處理的工作中甚至將其作為一本算法優(yōu)化的Cookbook來讀。另外,在與左老師共事期間,我發(fā)現(xiàn)他很多優(yōu)秀的算法設(shè)計也源自撰寫此書期間對基礎(chǔ)算法的積累和沉淀。所以,同樣推薦給已經(jīng)通過面試的各位職場人。

——Roy Yang GrowingIO前端負責(zé)人

程云總是能清晰敏銳地點出算法題的關(guān)鍵思路并給出優(yōu)雅的實現(xiàn),讓人醍醐灌頂。這本書凝聚了他多年的思考與沉淀,相信能成為程序員的良好指導(dǎo),使其找到化繁為簡、領(lǐng)悟解題的要訣。此書能助你斬獲心儀的Offer。

——劉耀東 今日頭條高級工程師

本書涵蓋了互聯(lián)網(wǎng)公司面試時的絕大多數(shù)算法題型,不僅是求職的好幫手,而且對實際的工作也很有指導(dǎo)意義。作者對題目的講解鞭辟入里,讀起來讓人耳目一新,不由得感概原來算法題要這樣做!

——付強 高級研發(fā)工程師

求職或跳槽刷題人的優(yōu)選工具用書!作者借助豐富的工作經(jīng)驗和對算法的深刻理解,通過精辟的示例,把代碼面試題目至優(yōu)解解釋得簡明和“平易近人”。

——楊猛 高級工程師


目錄

【目錄】

第1章 棧和隊列

└ 設(shè)計一個有g(shù)etMin功能的棧

└ 由兩個棧組成的隊列

└ 如何僅用遞歸函數(shù)和棧操作逆序一個棧

└ 貓狗隊列

└ 用一個棧實現(xiàn)另一個棧的排序

└ 用棧來求解漢諾塔問題

└ 生成窗口最大值數(shù)組

└ 單調(diào)棧結(jié)構(gòu)

└ 求最大子矩陣的大小

└ 最大值減去最小值小于或等于num的子數(shù)組數(shù)量

第2章 鏈表問題

└ 可見的山峰對數(shù)量

└ 打印兩個有序鏈表的公共部分

└ 在單鏈表和雙鏈表中刪除倒數(shù)第K個節(jié)點

└ 刪除鏈表的中間節(jié)點和a/b處的節(jié)點

└ 反轉(zhuǎn)單向和雙向鏈表

└ 反轉(zhuǎn)部分單向鏈表

└ 環(huán)形單鏈表的約瑟夫問題

└ 判斷一個鏈表是否為回文結(jié)構(gòu)

└ 將單向鏈表按某值劃分成左邊小、中間相等、右邊大的形式

└ 復(fù)制含有隨機指針節(jié)點的鏈表

└ 兩個單鏈表生成相加鏈表

└ 兩個單鏈表相交的一系列問題

└ 將單鏈表的每K個節(jié)點之間逆序

└ 刪除無序單鏈表中值重復(fù)出現(xiàn)的節(jié)點

└ 在單鏈表中刪除指定值的節(jié)點

└ 將搜索二叉樹轉(zhuǎn)換成雙向鏈表

└ 單鏈表的選擇排序

└ 一種怪異的節(jié)點刪除方式

└ 向有序的環(huán)形單鏈表中插入新節(jié)點

└ 合并兩個有序的單鏈表

└ 按照左右半?yún)^(qū)的方式重新組合單鏈表

第3章 二叉樹問題

└ 分別用遞歸和非遞歸方式實現(xiàn)二叉樹先序、中序和后序遍歷

└ 打印二叉樹的邊界節(jié)點

└ 如何較為直觀地打印二叉樹

└ 二叉樹的序列化和反序列化

└ 遍歷二叉樹的神級方法

└ 在二叉樹中找到累加和為指定值的最長路徑長度

└ 找到二叉樹中的最大搜索二叉子樹

└ 找到二叉樹中符合搜索二叉樹條件的最大拓撲結(jié)構(gòu)

└ 二叉樹的按層打印與ZigZag打印

└ 調(diào)整搜索二叉樹中兩個錯誤的節(jié)點

└ 判斷t1樹是否包含t2樹全部的拓撲結(jié)構(gòu)

└ 判斷t1樹中是否有與t2樹拓撲結(jié)構(gòu)完全相同的子樹

└ 判斷二叉樹是否為平衡二叉樹

└ 根據(jù)后序數(shù)組重建搜索二叉樹

└ 判斷一棵二叉樹是否為搜索二叉樹和完全二叉樹

└ 通過有序數(shù)組生成平衡搜索二叉樹

└ 在二叉樹中找到一個節(jié)點的后繼節(jié)點

└ 在二叉樹中找到兩個節(jié)點的最近公共祖先

└ Tarjan算法與并查集解決二叉樹節(jié)點間最近公共祖先的批量查詢問題

└ 二叉樹節(jié)點間的最大距離問題

└ 派對的最大快樂值

└ 通過先序和中序數(shù)組生成后序數(shù)組

└ 統(tǒng)計和生成所有不同的二叉樹

└ 統(tǒng)計完全二叉樹的節(jié)點數(shù)

第4章 遞歸和動態(tài)規(guī)劃

└ 斐波那契數(shù)列問題的遞歸和動態(tài)規(guī)劃

└ 矩陣的最小路徑和

└ 換錢的最少貨幣數(shù)

└ 機器人達到指定位置方法數(shù)

└ 換錢的方法數(shù)

└ 打氣球的最大分數(shù)

└ 最長遞增子序列

└ 信封嵌套問題

└ 漢諾塔問題

└ 最長公共子序列問題

└ 最長公共子串問題

└ 子數(shù)組異或和為0的最多劃分

└ 最小編輯代價

└ 字符串的交錯組成

└ 龍與地下城游戲問題

└ 數(shù)字字符串轉(zhuǎn)換為字母組合的種數(shù)

└ 表達式得到期望結(jié)果的組成種數(shù)

└ 排成一條線的紙牌博弈問題

└ 跳躍游戲

└ 數(shù)組中的最長連續(xù)序列

└ N皇后問題

第5章 字符串問題

└ 判斷兩個字符串是否互為變形詞

└ 判斷兩個字符串是否互為旋轉(zhuǎn)詞

└ 將整數(shù)字符串轉(zhuǎn)成整數(shù)值

└ 字符串的統(tǒng)計字符串

└ 判斷字符數(shù)組中是否所有的字符都只出現(xiàn)過一次

└ 在有序但含有空的數(shù)組中查找字符串

└ 字符串的調(diào)整與替換

└ 翻轉(zhuǎn)字符串

└ 完美洗牌問題

└ 刪除多余字符得到字典序最小的字符串

└ 數(shù)組中兩個字符串的最小距離

└ 字符串的轉(zhuǎn)換路徑問題

└ 添加最少字符使字符串整體都是回文字符串

└ 括號字符串的有效性和最長有效長度

└ 公式字符串求值

└ 0左邊必有1的二進制字符串?dāng)?shù)量

└ 拼接所有字符串產(chǎn)生字典順序最小的大寫字符串

└ 找到字符串的最長無重復(fù)字符子串

└ 找到指定的新類型字符

└ 旋變字符串問題

└ 最小包含子串的長度

└ 回文最少分割數(shù)

└ 字符串匹配問題

└ 字典樹(前綴樹)的實現(xiàn)

└ 子數(shù)組的最大異或和

第6章 大數(shù)據(jù)和空間限制

└ 認識布隆過濾器

└ 只用2GB內(nèi)存在20億個整數(shù)中找到出現(xiàn)次數(shù)最多的數(shù)

└ 40億個非負整數(shù)中找到未出現(xiàn)的數(shù)

└ 找到100億個URL中重復(fù)的URL及搜索詞匯的Top K問題

└ 40億個非負整數(shù)中找到出現(xiàn)兩次的數(shù)和所有數(shù)的中位數(shù)

└ 一致性哈希算法的基本原理

└ 島問題

第7章 位運算

└ 不用額外變量交換兩個整數(shù)的值

└ 不用做任何比較判斷找出兩個數(shù)中較大的數(shù)

└ 只用位運算不用算術(shù)運算實現(xiàn)整數(shù)的加減乘除運算

└ 整數(shù)的二進制數(shù)表達中有多少個1

└ 在其他數(shù)都出現(xiàn)偶數(shù)次的數(shù)組中找到出現(xiàn)奇數(shù)次的數(shù)

└ 在其他數(shù)都出現(xiàn)k次的數(shù)組中找到只出現(xiàn)一次的數(shù)

└ 第8章 數(shù)組和矩陣問題

└ 轉(zhuǎn)圈打印矩陣

└ 將正方形矩陣順時針轉(zhuǎn)動90°

└ “之”字形打印矩陣

└ 找到無序數(shù)組中最小的k個數(shù)

└ 需要排序的最短子數(shù)組長度

└ 在數(shù)組中找到出現(xiàn)次數(shù)大于N/K的數(shù)

└ 在行列都排好序的矩陣中找指定數(shù)

└ 最長的可整合子數(shù)組的長度

└ 不重復(fù)打印排序數(shù)組中相加和為給定值的所有二元組和三元組

└ 未排序正數(shù)數(shù)組中累加和為給定值的最長子數(shù)組長度

└ 未排序數(shù)組中累加和為給定值的最長子數(shù)組系列問題

└ 未排序數(shù)組中累加和小于或等于給定值的最長子數(shù)組長度

└ 計算數(shù)組的小和

└ 自然數(shù)數(shù)組的排序

└ 奇數(shù)下標(biāo)都是奇數(shù)或者偶數(shù)下標(biāo)都是偶數(shù)

└ 子數(shù)組的最大累加和問題

└ 子矩陣的最大累加和問題

└ 在數(shù)組中找到一個局部最小的位置

└ 數(shù)組中子數(shù)組的最大累乘積

└ 打印N個數(shù)組整體最大的Top K

└ 邊界都是1的最大正方形大小

└ 不包含本位置值的累乘數(shù)組

└ 數(shù)組的partition調(diào)整

└ 求最短通路值

└ 數(shù)組中未出現(xiàn)的最小正整數(shù)

└ 數(shù)組排序之后相鄰數(shù)的最大差值

└ 做項目的最大收益問題

└ 分金條的最小花費

└ 大樓輪廓問題

└ 加油站良好出發(fā)點問題

└ 容器盛水問題

第9章 其他題目

└ 從5隨機到7隨機及其擴展

└ 一行代碼求兩個數(shù)的最大公約數(shù)

└ 有關(guān)階乘的兩個問題

└ 判斷一個點是否在矩形內(nèi)部

└ 判斷一個點是否在三角形內(nèi)部

└ 折紙問題

└ 能否完美地拼成矩形

└ 蓄水池算法

└ 設(shè)計有setAll功能的哈希表

└ 最大的leftMax與rightMax之差的絕對值

└ 設(shè)計LRU緩存結(jié)構(gòu)

└ LFU緩存結(jié)構(gòu)設(shè)計

└ 設(shè)計RandomPool結(jié)構(gòu)

└ 并查集的實現(xiàn)

└ 調(diào)整[0,x)區(qū)間上的數(shù)出現(xiàn)的概率

└ 路徑數(shù)組變?yōu)榻y(tǒng)計數(shù)組

└ 正數(shù)數(shù)組的最小不可組成和

└ 累加出整個范圍所有的數(shù)最少還需幾個數(shù)

└ 一種字符串和數(shù)字的對應(yīng)關(guān)系

└ 1到n中1出現(xiàn)的次數(shù)

└ 從N個數(shù)中等概率打印M個數(shù)

└ 判斷一個數(shù)是否是回文數(shù)

└ 在有序旋轉(zhuǎn)數(shù)組中找到最小值

└ 在有序旋轉(zhuǎn)數(shù)組中找到一個數(shù)

└ 數(shù)字的英文表達和中文表達

└ 分糖果問題

└ 一種消息接收并打印的結(jié)構(gòu)設(shè)計

└ 隨時找到數(shù)據(jù)流的中位數(shù)

└ 在兩個長度相等的排序數(shù)組中找到上中位數(shù)

└ 在兩個排序數(shù)組中找到第k小的數(shù)

└ 兩個有序數(shù)組間相加和的Top k問題

└ 出現(xiàn)次數(shù)的Top k問題

└ Manacher算法

└ KMP算法

└ 丟棋子問題

└ 畫匠問題

└ 郵局選址問題


前言/序言

  自序

  我能出書挺意外的。

  雖然我早就知道想進入那些大公司要靠“刷”代碼面試題來練習(xí)編寫代碼的能力,可是在6年前的某一天,我突然有了心情去看代碼面試題長什么樣子,于是收集了代碼面試的題目。了解得越深入,我就越有一種恐慌的感覺,因為感覺自己什么都不太在行,對一個歸并排序(Merge sort)寫出完整的代碼都感覺挺費勁的,面對這個馮·諾依曼發(fā)明的排序算法,我真的有底氣說自己是計算機專業(yè)的學(xué)生嗎?這種打擊并沒有持續(xù)太久,因為愛耍小聰明的人總會特別自信。我決定開始認真面對“刷”題這件事,但那時我根本不知道我即將面對什么,更不會有寫書的念頭。

  我把課余時間利用起來,心想:不就是“刷”題嗎?別人能寫出來,咱也能寫出來。起初的心態(tài)是我不服,我就想告訴自己能行。過程虐心是肯定的,經(jīng)常半夜因為看到一個復(fù)雜度特別低的算法自己真的不能理解而沮喪地睡不著覺。當(dāng)時覺得找不到資料能徹底讓我明白,書上講得太粗淺,網(wǎng)上講的太散亂,代碼寫得看不懂。起初我“刷”題的時候無數(shù)次地想放棄,因為覺得這些都是什么玩意兒!我為什么放著好好的日子不過,去找這種罪受?可是我又不甘心,雖然我不懂很多解法,但是我覺得它們真的很有意思。

  我將能買到的所有相關(guān)書籍上的所有題目全都研究了一遍,無論是中文的還是英文的,我都硬著頭皮“啃”。寫完每道題后,我都和書上的方法進行反復(fù)對比。“啃”完了五六本書之后,距離我剛開始“刷”題已經(jīng)過去16個月了。寫書?別逗了,才剛看完。

  “年輕人總會找借口說這個東西不是我感興趣的,所以做不好是應(yīng)該的。但他們沒有注意的是,你面對的事情中感興趣的事情總是少數(shù),這就使得大多數(shù)時候你做事情的態(tài)度總是很懈怠、很消極,這使你變成了一個懈怠的人。當(dāng)你真正面對自己感興趣的東西時,你發(fā)現(xiàn)你已經(jīng)攥不緊拳頭了?!睍r常想起本科時的畢業(yè)設(shè)計指導(dǎo)老師——高鵬義老師說的這段話。說得對!對一個東西,如果你沒有透徹研究過,就不要輕易說它不精彩。這不是博愛,而是對自己認真。

  “刷”題代碼達到4萬行的時候,我基本上成了國內(nèi)外所有熱門“刷”題網(wǎng)站的日常用戶,此時我確認了一件事情,今天的代碼面試指導(dǎo)真的處在一個很初級的階段,這種不健全是全方面的。

  例如:

  經(jīng)??吹揭黄恼虑昂蟮恼Z境是割裂的,作者經(jīng)常根據(jù)之前的一個優(yōu)良解法提出更好的優(yōu)化方式,但整篇文章都不提及之前的解法是什么。這就導(dǎo)致初學(xué)者根本無法看懂?! 缀跛械臅己雎岳訋淼囊龑?dǎo)作用,甚至還有不少書籍在闡述一個解法的時候只寫偽代碼,這就使得讀者在看懂意思和自己真正能寫出代碼之間其實還有很多的路要走。

  代碼面試題目的特點是“多”“雜”“難”,從著手開始學(xué)習(xí)到最終達到自己想要的效果之間,自己對自己的評估根本無從談起?!奥毎?,學(xué)海無涯”成為主要的心態(tài),這就難免會產(chǎn)生懷疑的情緒。

  看見一道新的面試題時還是會無從下手,因為之前的學(xué)習(xí)無法做到舉一反三,對自己做過的題目缺乏總結(jié)和歸納。

  難道“刷”題真的只適合“聰明人”?我不這么看,既然大多數(shù)內(nèi)容處在有待商榷的階段,那我就去學(xué)習(xí)原論文吧。

  記得當(dāng)時我一個人在國外,在初冬的一個下午,“刷”題已經(jīng)兩年之久,快吃晚飯的時候,我突然想起自己忘了吃午飯,就沖出家門去覓食。站在7-11門前的廣場上,我拿著1.5美元的熱狗和75美分的咖啡,微溫的陽光撒在身上,遠遠地望著即將消失的太陽。我停下來,把咖啡放在斑駁的石頭臺子上,手里的熱狗挺好看,香腸和洋蔥都挺新鮮,清冷的空氣吹過來,卻讓我的心緒更亂。舊金山的天空五彩斑斕,讓漂泊者頭暈?zāi)垦!?薜酶鷤€鬼似的我除了想家,哪里敢設(shè)想自己會出書呢?

  當(dāng)我意識到在網(wǎng)上很難搜索到新鮮的題目時,我已經(jīng)換了兩家公司,反復(fù)實現(xiàn)了600多道題目,編寫了差不多10萬行代碼。原來只是為了找份工作“刷”題這一初心早就忘了,而變成了興趣并堅持了這么久,我自己也感到意外。更奇怪的是,我已經(jīng)完全樂在其中,同時交流欲望越來越強,時常和同事們展開這方面的討論。我發(fā)現(xiàn)很多書上的解法不是最優(yōu),很多題目其實和同事們討論的做法更好,可以發(fā)現(xiàn)高手特別多,但好像都懶得動筆。

  有一天,我看到自己寫的題目,想到自己那些“抓心撓肝”的日子,突然覺得要不出書吧?我已經(jīng)離不開這種感覺了,如果這不是真愛,那什么才是呢?

  這不是一個勵志的故事,是一個愛“刷”題的人決定把很多最優(yōu)解講出來的過程,就這么簡單。

  左程云

  2015年7月20日


點此購買



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號