左程云 著
適讀人群 :在讀學(xué)生中,對(duì)算法和數(shù)據(jù)結(jié)構(gòu)內(nèi)容有興趣的群體; 想要從事編程方向相關(guān)工作國(guó)內(nèi)的本科生、研究生; 想要出國(guó)留學(xué),并有計(jì)劃畢業(yè)后在國(guó)外找工作,從事編程方向相關(guān)工作的留學(xué)生; 已經(jīng)工作,但是對(duì)算法和數(shù)據(jù)結(jié)構(gòu)有學(xué)習(xí)興趣的程序員。
如何在IT名企的面試中脫穎而出、一舉成名?這本書就是你應(yīng)該擁有的“神兵利器”?!八ⅰ蓖瓯緯?,你就是“題王”!
對(duì)于每一個(gè)程序員來(lái)說(shuō),提升算法和數(shù)據(jù)結(jié)構(gòu)等方面的能力至關(guān)重要。無(wú)數(shù)碼農(nóng)和編程愛(ài)好者“深陷”題海之中,無(wú)論你是為了代碼面試、提升能力而不情愿地刷題,還是愛(ài)好所致沉迷于此,這都是你值得擁有的案頭書。
這里有你在別處找不到的至優(yōu)解分析,有高頻出現(xiàn)在IT名氣代碼面試中的真題,有讓人拍案驚嘆巧妙的題目解法,也有讓你工作中的編程難題迎刃而解的啟發(fā)……
第2版說(shuō)明:
1.修改了第1版部分題目的解釋,并增加了更多示例。
2.增加了很多新出現(xiàn)的流行面試題,刪掉了已經(jīng)過(guò)時(shí)的低頻面試題。
3.針對(duì)解題套路與算法原型做了結(jié)構(gòu)化的調(diào)整和總結(jié)。
《程序員代碼面試指南(第2版)》是一本程序員代碼面試寶典!書中對(duì)IT名企代碼面試各類題目的至優(yōu)解進(jìn)行了總結(jié),并提供了相關(guān)代碼實(shí)現(xiàn)。針對(duì)當(dāng)前程序員面試缺乏題目匯總這一痛點(diǎn),本書選取將近200道真實(shí)出現(xiàn)過(guò)的經(jīng)典代碼面試題,幫助廣大程序員做充分的面試準(zhǔn)備?!八ⅰ蓖瓯緯?,你就是“題王”!
《程序員代碼面試指南(第2版)》采用“題目+解答”的方式組織內(nèi)容,并把面試題類型相近或者解法相近的題目盡量放在一起,讀者在學(xué)習(xí)本書時(shí)很容易看出面試題解法之間的聯(lián)系,使知識(shí)的學(xué)習(xí)避免碎片化。本書將所有的面試題從難到易依次分為“將”“?!薄拔尽薄笆俊彼膫€(gè)檔次,方便讀者有針對(duì)性地選擇“刷”題。本書收錄的所有面試題都給出了至優(yōu)解講解和代碼實(shí)現(xiàn),并且提供了一些普通解法和至優(yōu)解法的運(yùn)行時(shí)間對(duì)比,讓讀者真切地感受到至優(yōu)解的魅力!
《程序員代碼面試指南:(第2版)》中的題目全面且經(jīng)典,更重要的是,書中收錄了大量新題目和至優(yōu)解分析,這些內(nèi)容源自筆者多年來(lái)“死磕自己”的深入思考。
程序員們做好準(zhǔn)備在IT名企的面試中脫穎而出、一舉成名了嗎?《程序員代碼面試指南(第2版)》就是你應(yīng)該擁有的“神兵利器”。當(dāng)然,對(duì)需要提升算法和數(shù)據(jù)結(jié)構(gòu)等方面能力的程序員而言,《程序員代碼面試指南(第2版)》的價(jià)值也是顯而易見(jiàn)的。
左程云,本科和碩士先后就讀于華中科技大學(xué)和芝加哥大學(xué),在多家國(guó)內(nèi)外優(yōu)秀互聯(lián)網(wǎng)公司工作多年。自2010年起專注刷題至今,從2015年開(kāi)始利用業(yè)余時(shí)間在??途W(wǎng)平臺(tái)針對(duì)代碼面試與算法開(kāi)始教學(xué)工作。
【精彩書評(píng)】
這本書不僅可以作為代碼面試指南,還可以作為學(xué)生與程序員的輔助練習(xí)。作者刷題多年,悉數(shù)總結(jié)沉淀在這本書里。跟著他的引導(dǎo),從頭到尾逐一攻克必有收獲。
——葉向宇 牛客網(wǎng)CEO
對(duì)于工程師而言,算法既是基礎(chǔ)能力,也是進(jìn)階突破的必備能力。本書內(nèi)容深入淺出,不僅涉及算法知識(shí)本身,更能讓讀者解決問(wèn)題的思維升級(jí)。不論是面試準(zhǔn)備,還是日常學(xué)習(xí),本書都可以成為你進(jìn)入算法世界的至優(yōu)選擇。
——葉玎玎 GrowingIO CTO
相比在網(wǎng)上泛泛地刷題,這本書更強(qiáng)調(diào)至優(yōu)解和舉一反三的能力。對(duì)算法原型的介紹也能幫助程序員更高效地準(zhǔn)備面試與提升自己,以及在不斷變化的題目中迅速找到思路。
——鞠林 阿里巴巴達(dá)摩院人工智能實(shí)驗(yàn)室技術(shù)專家
大部頭的經(jīng)典書人人都買得起,但是卻沒(méi)幾個(gè)人看得進(jìn)去。而在本書中,作者通過(guò)自己對(duì)常見(jiàn)算法知識(shí)的理解,精心選擇了一道道真實(shí)的高頻面試題,循序漸進(jìn)地提升題目難度,輔以翔實(shí)的解題思路,讓讀者真正學(xué)得到內(nèi)容,并學(xué)得下去。
——徐云釗@imToken 全棧工程師 & 區(qū)塊鏈技術(shù)開(kāi)發(fā)
此書不僅對(duì)準(zhǔn)備面試而刷題的人有幫助,還針對(duì)算法流程的優(yōu)化技巧做了多維度的詳盡闡述,在我數(shù)據(jù)處理的工作中甚至將其作為一本算法優(yōu)化的Cookbook來(lái)讀。另外,在與左老師共事期間,我發(fā)現(xiàn)他很多優(yōu)秀的算法設(shè)計(jì)也源自撰寫此書期間對(duì)基礎(chǔ)算法的積累和沉淀。所以,同樣推薦給已經(jīng)通過(guò)面試的各位職場(chǎng)人。
——Roy Yang GrowingIO前端負(fù)責(zé)人
程云總是能清晰敏銳地點(diǎn)出算法題的關(guān)鍵思路并給出優(yōu)雅的實(shí)現(xiàn),讓人醍醐灌頂。這本書凝聚了他多年的思考與沉淀,相信能成為程序員的良好指導(dǎo),使其找到化繁為簡(jiǎn)、領(lǐng)悟解題的要訣。此書能助你斬獲心儀的Offer。
——?jiǎng)⒁珫| 今日頭條高級(jí)工程師
本書涵蓋了互聯(lián)網(wǎng)公司面試時(shí)的絕大多數(shù)算法題型,不僅是求職的好幫手,而且對(duì)實(shí)際的工作也很有指導(dǎo)意義。作者對(duì)題目的講解鞭辟入里,讀起來(lái)讓人耳目一新,不由得感概原來(lái)算法題要這樣做!
——付強(qiáng) 高級(jí)研發(fā)工程師
求職或跳槽刷題人的優(yōu)選工具用書!作者借助豐富的工作經(jīng)驗(yàn)和對(duì)算法的深刻理解,通過(guò)精辟的示例,把代碼面試題目至優(yōu)解解釋得簡(jiǎn)明和“平易近人”。
——楊猛 高級(jí)工程師
【目錄】
第1章 棧和隊(duì)列
└ 設(shè)計(jì)一個(gè)有g(shù)etMin功能的棧
└ 由兩個(gè)棧組成的隊(duì)列
└ 如何僅用遞歸函數(shù)和棧操作逆序一個(gè)棧
└ 貓狗隊(duì)列
└ 用一個(gè)棧實(shí)現(xiàn)另一個(gè)棧的排序
└ 用棧來(lái)求解漢諾塔問(wèn)題
└ 生成窗口最大值數(shù)組
└ 單調(diào)棧結(jié)構(gòu)
└ 求最大子矩陣的大小
└ 最大值減去最小值小于或等于num的子數(shù)組數(shù)量
第2章 鏈表問(wèn)題
└ 可見(jiàn)的山峰對(duì)數(shù)量
└ 打印兩個(gè)有序鏈表的公共部分
└ 在單鏈表和雙鏈表中刪除倒數(shù)第K個(gè)節(jié)點(diǎn)
└ 刪除鏈表的中間節(jié)點(diǎn)和a/b處的節(jié)點(diǎn)
└ 反轉(zhuǎn)單向和雙向鏈表
└ 反轉(zhuǎn)部分單向鏈表
└ 環(huán)形單鏈表的約瑟夫問(wèn)題
└ 判斷一個(gè)鏈表是否為回文結(jié)構(gòu)
└ 將單向鏈表按某值劃分成左邊小、中間相等、右邊大的形式
└ 復(fù)制含有隨機(jī)指針節(jié)點(diǎn)的鏈表
└ 兩個(gè)單鏈表生成相加鏈表
└ 兩個(gè)單鏈表相交的一系列問(wèn)題
└ 將單鏈表的每K個(gè)節(jié)點(diǎn)之間逆序
└ 刪除無(wú)序單鏈表中值重復(fù)出現(xiàn)的節(jié)點(diǎn)
└ 在單鏈表中刪除指定值的節(jié)點(diǎn)
└ 將搜索二叉樹(shù)轉(zhuǎn)換成雙向鏈表
└ 單鏈表的選擇排序
└ 一種怪異的節(jié)點(diǎn)刪除方式
└ 向有序的環(huán)形單鏈表中插入新節(jié)點(diǎn)
└ 合并兩個(gè)有序的單鏈表
└ 按照左右半?yún)^(qū)的方式重新組合單鏈表
第3章 二叉樹(shù)問(wèn)題
└ 分別用遞歸和非遞歸方式實(shí)現(xiàn)二叉樹(shù)先序、中序和后序遍歷
└ 打印二叉樹(shù)的邊界節(jié)點(diǎn)
└ 如何較為直觀地打印二叉樹(shù)
└ 二叉樹(shù)的序列化和反序列化
└ 遍歷二叉樹(shù)的神級(jí)方法
└ 在二叉樹(shù)中找到累加和為指定值的最長(zhǎng)路徑長(zhǎng)度
└ 找到二叉樹(shù)中的最大搜索二叉子樹(shù)
└ 找到二叉樹(shù)中符合搜索二叉樹(shù)條件的最大拓?fù)浣Y(jié)構(gòu)
└ 二叉樹(shù)的按層打印與ZigZag打印
└ 調(diào)整搜索二叉樹(shù)中兩個(gè)錯(cuò)誤的節(jié)點(diǎn)
└ 判斷t1樹(shù)是否包含t2樹(shù)全部的拓?fù)浣Y(jié)構(gòu)
└ 判斷t1樹(shù)中是否有與t2樹(shù)拓?fù)浣Y(jié)構(gòu)完全相同的子樹(shù)
└ 判斷二叉樹(shù)是否為平衡二叉樹(shù)
└ 根據(jù)后序數(shù)組重建搜索二叉樹(shù)
└ 判斷一棵二叉樹(shù)是否為搜索二叉樹(shù)和完全二叉樹(shù)
└ 通過(guò)有序數(shù)組生成平衡搜索二叉樹(shù)
└ 在二叉樹(shù)中找到一個(gè)節(jié)點(diǎn)的后繼節(jié)點(diǎn)
└ 在二叉樹(shù)中找到兩個(gè)節(jié)點(diǎn)的最近公共祖先
└ Tarjan算法與并查集解決二叉樹(shù)節(jié)點(diǎn)間最近公共祖先的批量查詢問(wèn)題
└ 二叉樹(shù)節(jié)點(diǎn)間的最大距離問(wèn)題
└ 派對(duì)的最大快樂(lè)值
└ 通過(guò)先序和中序數(shù)組生成后序數(shù)組
└ 統(tǒng)計(jì)和生成所有不同的二叉樹(shù)
└ 統(tǒng)計(jì)完全二叉樹(shù)的節(jié)點(diǎn)數(shù)
第4章 遞歸和動(dòng)態(tài)規(guī)劃
└ 斐波那契數(shù)列問(wèn)題的遞歸和動(dòng)態(tài)規(guī)劃
└ 矩陣的最小路徑和
└ 換錢的最少貨幣數(shù)
└ 機(jī)器人達(dá)到指定位置方法數(shù)
└ 換錢的方法數(shù)
└ 打氣球的最大分?jǐn)?shù)
└ 最長(zhǎng)遞增子序列
└ 信封嵌套問(wèn)題
└ 漢諾塔問(wèn)題
└ 最長(zhǎng)公共子序列問(wèn)題
└ 最長(zhǎng)公共子串問(wèn)題
└ 子數(shù)組異或和為0的最多劃分
└ 最小編輯代價(jià)
└ 字符串的交錯(cuò)組成
└ 龍與地下城游戲問(wèn)題
└ 數(shù)字字符串轉(zhuǎn)換為字母組合的種數(shù)
└ 表達(dá)式得到期望結(jié)果的組成種數(shù)
└ 排成一條線的紙牌博弈問(wèn)題
└ 跳躍游戲
└ 數(shù)組中的最長(zhǎng)連續(xù)序列
└ N皇后問(wèn)題
第5章 字符串問(wèn)題
└ 判斷兩個(gè)字符串是否互為變形詞
└ 判斷兩個(gè)字符串是否互為旋轉(zhuǎn)詞
└ 將整數(shù)字符串轉(zhuǎn)成整數(shù)值
└ 字符串的統(tǒng)計(jì)字符串
└ 判斷字符數(shù)組中是否所有的字符都只出現(xiàn)過(guò)一次
└ 在有序但含有空的數(shù)組中查找字符串
└ 字符串的調(diào)整與替換
└ 翻轉(zhuǎn)字符串
└ 完美洗牌問(wèn)題
└ 刪除多余字符得到字典序最小的字符串
└ 數(shù)組中兩個(gè)字符串的最小距離
└ 字符串的轉(zhuǎn)換路徑問(wèn)題
└ 添加最少字符使字符串整體都是回文字符串
└ 括號(hào)字符串的有效性和最長(zhǎng)有效長(zhǎng)度
└ 公式字符串求值
└ 0左邊必有1的二進(jìn)制字符串?dāng)?shù)量
└ 拼接所有字符串產(chǎn)生字典順序最小的大寫字符串
└ 找到字符串的最長(zhǎng)無(wú)重復(fù)字符子串
└ 找到指定的新類型字符
└ 旋變字符串問(wèn)題
└ 最小包含子串的長(zhǎng)度
└ 回文最少分割數(shù)
└ 字符串匹配問(wèn)題
└ 字典樹(shù)(前綴樹(shù))的實(shí)現(xiàn)
└ 子數(shù)組的最大異或和
第6章 大數(shù)據(jù)和空間限制
└ 認(rèn)識(shí)布隆過(guò)濾器
└ 只用2GB內(nèi)存在20億個(gè)整數(shù)中找到出現(xiàn)次數(shù)最多的數(shù)
└ 40億個(gè)非負(fù)整數(shù)中找到未出現(xiàn)的數(shù)
└ 找到100億個(gè)URL中重復(fù)的URL及搜索詞匯的Top K問(wèn)題
└ 40億個(gè)非負(fù)整數(shù)中找到出現(xiàn)兩次的數(shù)和所有數(shù)的中位數(shù)
└ 一致性哈希算法的基本原理
└ 島問(wèn)題
第7章 位運(yùn)算
└ 不用額外變量交換兩個(gè)整數(shù)的值
└ 不用做任何比較判斷找出兩個(gè)數(shù)中較大的數(shù)
└ 只用位運(yùn)算不用算術(shù)運(yùn)算實(shí)現(xiàn)整數(shù)的加減乘除運(yùn)算
└ 整數(shù)的二進(jìn)制數(shù)表達(dá)中有多少個(gè)1
└ 在其他數(shù)都出現(xiàn)偶數(shù)次的數(shù)組中找到出現(xiàn)奇數(shù)次的數(shù)
└ 在其他數(shù)都出現(xiàn)k次的數(shù)組中找到只出現(xiàn)一次的數(shù)
└ 第8章 數(shù)組和矩陣問(wèn)題
└ 轉(zhuǎn)圈打印矩陣
└ 將正方形矩陣順時(shí)針轉(zhuǎn)動(dòng)90°
└ “之”字形打印矩陣
└ 找到無(wú)序數(shù)組中最小的k個(gè)數(shù)
└ 需要排序的最短子數(shù)組長(zhǎng)度
└ 在數(shù)組中找到出現(xiàn)次數(shù)大于N/K的數(shù)
└ 在行列都排好序的矩陣中找指定數(shù)
└ 最長(zhǎng)的可整合子數(shù)組的長(zhǎng)度
└ 不重復(fù)打印排序數(shù)組中相加和為給定值的所有二元組和三元組
└ 未排序正數(shù)數(shù)組中累加和為給定值的最長(zhǎng)子數(shù)組長(zhǎng)度
└ 未排序數(shù)組中累加和為給定值的最長(zhǎng)子數(shù)組系列問(wèn)題
└ 未排序數(shù)組中累加和小于或等于給定值的最長(zhǎng)子數(shù)組長(zhǎng)度
└ 計(jì)算數(shù)組的小和
└ 自然數(shù)數(shù)組的排序
└ 奇數(shù)下標(biāo)都是奇數(shù)或者偶數(shù)下標(biāo)都是偶數(shù)
└ 子數(shù)組的最大累加和問(wèn)題
└ 子矩陣的最大累加和問(wèn)題
└ 在數(shù)組中找到一個(gè)局部最小的位置
└ 數(shù)組中子數(shù)組的最大累乘積
└ 打印N個(gè)數(shù)組整體最大的Top K
└ 邊界都是1的最大正方形大小
└ 不包含本位置值的累乘數(shù)組
└ 數(shù)組的partition調(diào)整
└ 求最短通路值
└ 數(shù)組中未出現(xiàn)的最小正整數(shù)
└ 數(shù)組排序之后相鄰數(shù)的最大差值
└ 做項(xiàng)目的最大收益問(wèn)題
└ 分金條的最小花費(fèi)
└ 大樓輪廓問(wèn)題
└ 加油站良好出發(fā)點(diǎn)問(wèn)題
└ 容器盛水問(wèn)題
第9章 其他題目
└ 從5隨機(jī)到7隨機(jī)及其擴(kuò)展
└ 一行代碼求兩個(gè)數(shù)的最大公約數(shù)
└ 有關(guān)階乘的兩個(gè)問(wèn)題
└ 判斷一個(gè)點(diǎn)是否在矩形內(nèi)部
└ 判斷一個(gè)點(diǎn)是否在三角形內(nèi)部
└ 折紙問(wèn)題
└ 能否完美地拼成矩形
└ 蓄水池算法
└ 設(shè)計(jì)有setAll功能的哈希表
└ 最大的leftMax與rightMax之差的絕對(duì)值
└ 設(shè)計(jì)LRU緩存結(jié)構(gòu)
└ LFU緩存結(jié)構(gòu)設(shè)計(jì)
└ 設(shè)計(jì)RandomPool結(jié)構(gòu)
└ 并查集的實(shí)現(xiàn)
└ 調(diào)整[0,x)區(qū)間上的數(shù)出現(xiàn)的概率
└ 路徑數(shù)組變?yōu)榻y(tǒng)計(jì)數(shù)組
└ 正數(shù)數(shù)組的最小不可組成和
└ 累加出整個(gè)范圍所有的數(shù)最少還需幾個(gè)數(shù)
└ 一種字符串和數(shù)字的對(duì)應(yīng)關(guān)系
└ 1到n中1出現(xiàn)的次數(shù)
└ 從N個(gè)數(shù)中等概率打印M個(gè)數(shù)
└ 判斷一個(gè)數(shù)是否是回文數(shù)
└ 在有序旋轉(zhuǎn)數(shù)組中找到最小值
└ 在有序旋轉(zhuǎn)數(shù)組中找到一個(gè)數(shù)
└ 數(shù)字的英文表達(dá)和中文表達(dá)
└ 分糖果問(wèn)題
└ 一種消息接收并打印的結(jié)構(gòu)設(shè)計(jì)
└ 隨時(shí)找到數(shù)據(jù)流的中位數(shù)
└ 在兩個(gè)長(zhǎng)度相等的排序數(shù)組中找到上中位數(shù)
└ 在兩個(gè)排序數(shù)組中找到第k小的數(shù)
└ 兩個(gè)有序數(shù)組間相加和的Top k問(wèn)題
└ 出現(xiàn)次數(shù)的Top k問(wèn)題
└ Manacher算法
└ KMP算法
└ 丟棋子問(wèn)題
└ 畫匠問(wèn)題
└ 郵局選址問(wèn)題
自序
我能出書挺意外的。
雖然我早就知道想進(jìn)入那些大公司要靠“刷”代碼面試題來(lái)練習(xí)編寫代碼的能力,可是在6年前的某一天,我突然有了心情去看代碼面試題長(zhǎng)什么樣子,于是收集了代碼面試的題目。了解得越深入,我就越有一種恐慌的感覺(jué),因?yàn)楦杏X(jué)自己什么都不太在行,對(duì)一個(gè)歸并排序(Merge sort)寫出完整的代碼都感覺(jué)挺費(fèi)勁的,面對(duì)這個(gè)馮·諾依曼發(fā)明的排序算法,我真的有底氣說(shuō)自己是計(jì)算機(jī)專業(yè)的學(xué)生嗎?這種打擊并沒(méi)有持續(xù)太久,因?yàn)閻?ài)耍小聰明的人總會(huì)特別自信。我決定開(kāi)始認(rèn)真面對(duì)“刷”題這件事,但那時(shí)我根本不知道我即將面對(duì)什么,更不會(huì)有寫書的念頭。
我把課余時(shí)間利用起來(lái),心想:不就是“刷”題嗎?別人能寫出來(lái),咱也能寫出來(lái)。起初的心態(tài)是我不服,我就想告訴自己能行。過(guò)程虐心是肯定的,經(jīng)常半夜因?yàn)榭吹揭粋€(gè)復(fù)雜度特別低的算法自己真的不能理解而沮喪地睡不著覺(jué)。當(dāng)時(shí)覺(jué)得找不到資料能徹底讓我明白,書上講得太粗淺,網(wǎng)上講的太散亂,代碼寫得看不懂。起初我“刷”題的時(shí)候無(wú)數(shù)次地想放棄,因?yàn)橛X(jué)得這些都是什么玩意兒!我為什么放著好好的日子不過(guò),去找這種罪受?可是我又不甘心,雖然我不懂很多解法,但是我覺(jué)得它們真的很有意思。
我將能買到的所有相關(guān)書籍上的所有題目全都研究了一遍,無(wú)論是中文的還是英文的,我都硬著頭皮“啃”。寫完每道題后,我都和書上的方法進(jìn)行反復(fù)對(duì)比?!翱小蓖炅宋辶緯螅嚯x我剛開(kāi)始“刷”題已經(jīng)過(guò)去16個(gè)月了。寫書?別逗了,才剛看完。
“年輕人總會(huì)找借口說(shuō)這個(gè)東西不是我感興趣的,所以做不好是應(yīng)該的。但他們沒(méi)有注意的是,你面對(duì)的事情中感興趣的事情總是少數(shù),這就使得大多數(shù)時(shí)候你做事情的態(tài)度總是很懈怠、很消極,這使你變成了一個(gè)懈怠的人。當(dāng)你真正面對(duì)自己感興趣的東西時(shí),你發(fā)現(xiàn)你已經(jīng)攥不緊拳頭了?!睍r(shí)常想起本科時(shí)的畢業(yè)設(shè)計(jì)指導(dǎo)老師——高鵬義老師說(shuō)的這段話。說(shuō)得對(duì)!對(duì)一個(gè)東西,如果你沒(méi)有透徹研究過(guò),就不要輕易說(shuō)它不精彩。這不是博愛(ài),而是對(duì)自己認(rèn)真。
“刷”題代碼達(dá)到4萬(wàn)行的時(shí)候,我基本上成了國(guó)內(nèi)外所有熱門“刷”題網(wǎng)站的日常用戶,此時(shí)我確認(rèn)了一件事情,今天的代碼面試指導(dǎo)真的處在一個(gè)很初級(jí)的階段,這種不健全是全方面的。
例如:
經(jīng)??吹揭黄恼虑昂蟮恼Z(yǔ)境是割裂的,作者經(jīng)常根據(jù)之前的一個(gè)優(yōu)良解法提出更好的優(yōu)化方式,但整篇文章都不提及之前的解法是什么。這就導(dǎo)致初學(xué)者根本無(wú)法看懂?! 缀跛械臅己雎岳訋?lái)的引導(dǎo)作用,甚至還有不少書籍在闡述一個(gè)解法的時(shí)候只寫偽代碼,這就使得讀者在看懂意思和自己真正能寫出代碼之間其實(shí)還有很多的路要走。
代碼面試題目的特點(diǎn)是“多”“雜”“難”,從著手開(kāi)始學(xué)習(xí)到最終達(dá)到自己想要的效果之間,自己對(duì)自己的評(píng)估根本無(wú)從談起?!奥毎桑瑢W(xué)海無(wú)涯”成為主要的心態(tài),這就難免會(huì)產(chǎn)生懷疑的情緒。
看見(jiàn)一道新的面試題時(shí)還是會(huì)無(wú)從下手,因?yàn)橹暗膶W(xué)習(xí)無(wú)法做到舉一反三,對(duì)自己做過(guò)的題目缺乏總結(jié)和歸納。
難道“刷”題真的只適合“聰明人”?我不這么看,既然大多數(shù)內(nèi)容處在有待商榷的階段,那我就去學(xué)習(xí)原論文吧。
記得當(dāng)時(shí)我一個(gè)人在國(guó)外,在初冬的一個(gè)下午,“刷”題已經(jīng)兩年之久,快吃晚飯的時(shí)候,我突然想起自己忘了吃午飯,就沖出家門去覓食。站在7-11門前的廣場(chǎng)上,我拿著1.5美元的熱狗和75美分的咖啡,微溫的陽(yáng)光撒在身上,遠(yuǎn)遠(yuǎn)地望著即將消失的太陽(yáng)。我停下來(lái),把咖啡放在斑駁的石頭臺(tái)子上,手里的熱狗挺好看,香腸和洋蔥都挺新鮮,清冷的空氣吹過(guò)來(lái),卻讓我的心緒更亂。舊金山的天空五彩斑斕,讓漂泊者頭暈?zāi)垦!?薜酶鷤€(gè)鬼似的我除了想家,哪里敢設(shè)想自己會(huì)出書呢?
當(dāng)我意識(shí)到在網(wǎng)上很難搜索到新鮮的題目時(shí),我已經(jīng)換了兩家公司,反復(fù)實(shí)現(xiàn)了600多道題目,編寫了差不多10萬(wàn)行代碼。原來(lái)只是為了找份工作“刷”題這一初心早就忘了,而變成了興趣并堅(jiān)持了這么久,我自己也感到意外。更奇怪的是,我已經(jīng)完全樂(lè)在其中,同時(shí)交流欲望越來(lái)越強(qiáng),時(shí)常和同事們展開(kāi)這方面的討論。我發(fā)現(xiàn)很多書上的解法不是最優(yōu),很多題目其實(shí)和同事們討論的做法更好,可以發(fā)現(xiàn)高手特別多,但好像都懶得動(dòng)筆。
有一天,我看到自己寫的題目,想到自己那些“抓心撓肝”的日子,突然覺(jué)得要不出書吧?我已經(jīng)離不開(kāi)這種感覺(jué)了,如果這不是真愛(ài),那什么才是呢?
這不是一個(gè)勵(lì)志的故事,是一個(gè)愛(ài)“刷”題的人決定把很多最優(yōu)解講出來(lái)的過(guò)程,就這么簡(jiǎn)單。
左程云
2015年7月20日
更多建議: