又要到一年的招聘季了,肯定又有很多人開始啃《編程之美》了吧。這本書從開闊視野的角度來說很好,不過限于篇幅,有的問題并沒有講清楚(甚至問題敘述模棱兩可、被標榜為“鼓勵同面試官交流以獲得更多細節”);或者擴展問題本身很難,沒有給予解答和提示。在我看書并在網絡上查到的相關資料中,有很多重復的,也有不少基本沒什么價值,有價值的文章是少數。為了便于查閱,也為了方便后人不必在搜索上浪費時間,我把比較有價值的文章的鏈接整理在下面,并附以簡單說明。另外,對于一些比較早的資料,對應的是前幾版的《編程之美》;《編程之美》早起版本錯誤之多在勘誤表上可見一斑,不過既然新版已經修正了這些問題,那就請使用新書的讀者放心,并在瀏覽資料時注意。
作為定位與《編程之美》類似的《劍指Offer》,上面有不少對相同問題的解;后者讀起來實戰的臨場感更強一些(測試用例、邊界條件等),兩本書都值得一讀。解法相同的題就沒必要重述了,而解法不同或者做了一些擴展的題目一并標在下面。
?
1.1 讓CPU占用率曲線聽你指揮
《編程之美》讀書筆記23: 1.1 讓CPU占用率曲線聽你指揮
很多完整程序,這里取個代表。事實上對于不了解windows編程的人來說,這個問題難度要高于3星。
?
1.3 一摞烙餅的排序
烙餅啊烙餅{轉自ITEO
對擴展問題做了詳細探討,原出處沒有找到。
?
1.7 ?光影切割問題
逆序對:從插入排序到歸并排序
我的拙作,介紹了逆序對的尋找方式的優化。
?
1.11 NIM(1)一排石頭的游戲
1.12 NIM(2)“拈”游戲分析
1.13 NIM(3)兩堆石頭的游戲
拈及其各種變形遊戲
第五頁對1.13擴展的NIM(4)游戲有很好的解釋,并且全文可以看作NIM游戲的閱讀材料。
我有寫一篇總結NIM游戲規律的博文的計劃,不過不知道時間是否允許。
《劍指Offer》面試題40:只出現一次的數字
又是XOR的應用。
?
1.18 挖雷游戲
4.11 掃雷游戲的概率
這兩道題原書沒有解。
快照/轉帖
最早解答4.11的博文的百度快照,源地址我打不開。
編程之美掃雷篇
另一個角度解答4.11問題。
解答《編程之美》1.18問題1:給所有未標識方塊標注有地雷概率
我的拙作之二,對于網絡上沒有分析的1.18問題1進行解答。
?
2.1 求二進制中1的個數
《編程之美》讀書筆記——“求二進制數中1的個數”
這個是我買的紙質版《編程之美》這一節的讀者反饋里的鏈接,不過翻了下電子版,似乎早期的沒有,因此附在這里。
《劍指Offer》面試題10:二進制中1的個數
如果輸入是負數,那么《編程之美》第一段代碼還能運行嗎?(盡管它與《劍指Offer》解一不同)
?
2.19 區間重合判斷
編程之美2.19——區間重合判斷(線段樹)
擴展問題二維空間的覆蓋問題的線段樹解。
?
2.21 只考加法的面試題
《編程之美》2.21 只考加法的面試題
這個題原書也沒有解,此文已經很詳細了。
?
3.4 從無頭鏈表中刪除節點
《劍指Offer》面試題13:在O(1)時間刪除鏈表結點
如果給定了單鏈表頭結點和一個結點的指針,要求刪除此結點(可能是頭結點或尾結點),又該如何求解?
3.6 編程判斷兩個鏈表是否相交
? 《編程之美》3.6判斷鏈表是否相交之擴展:鏈表找環方法證明
?
我的拙作之三,其中原問題的解借鑒的部分請見注釋,此文主要是說明怎樣證明找環和找環入口算法的正確性。
同時,根據判環算法,可以解決3.11的擴展問題:鏈表判斷是否有環的程序改錯。
?
3.7 隊列中取最大值操作問題
《劍指Offer》面試題7:用兩個棧實現一個隊列
介紹了另一個問題:如何用兩個隊列實現一個棧??
?
3.8 求二叉樹中節點的最大距離
《編程之美: 求二叉樹中節點的最大距離》的另一個解法
本節總結里提到的鏈接,其實個人認為代碼比原書中漂亮多了。我轉載了此文:http://www.cnblogs.com/wuyuegb2312/articles/3174476.html
?
3.10 分層遍歷二叉樹
《編程之美:分層遍歷二叉樹》的另外兩個實現
本節節末提到的鏈接。其實我似乎記得當初在上嚴蔚敏版《數據結構》課程時,分層遍歷二叉樹就是借助隊列實現的,思想和這個一樣。
?
3.11 程序改錯
http://www.cnblogs.com/wuyuegb2312/archive/2013/05/26/3090369.html
我的拙作之四,全方位分析二分查找這個老生常談的問題,并不僅僅限于代碼改錯。有意避開陷阱要比掉入陷阱后想辦法爬出來更好,雖然這并不代表我們不需要知道如何爬上來。擴展問題——判斷鏈表是否有環的程序改錯——請看3.6的鏈接。
?
4.2 瓷磚覆蓋地板
poj 2411 & 編程之美 4.2 瓷磚覆蓋地板
是對擴展問題1“1*2瓷磚覆蓋8*8地板”的狀態動態規劃解法中我所看到的最簡潔易懂、空間占用少的。
更可貴的是本文提供了p*q瓷磚覆蓋M*N地板可行性的一般結論和閱讀資料(MIT的pdf)。
《劍指Offer》面試題9:斐波那契數列
擴展問題中,2*M的地板覆蓋問題的遞推公式F(M)=F(M-1)+F(M-2),形式上是斐波那契數列。
?
4.3 買票找零
從《編程之美》買票找零問題說起,娓娓道來卡特蘭數——兼爬坑指南
我的拙作之五,標題說明一切。
?
4.5 磁帶文件存放優化
《編程之美》4.5磁帶文件存放優化:最優解是怎樣煉成的
我的拙作之六,原書對于解是最優解根本沒有說明白,只是舉了個例子而已;這篇文章將告訴你為什么是最優解。
?
4.7 螞蟻爬桿
編程之美4.7螞蟻爬桿擴展問題附獵人抓狐貍(必勝策略)
對擴展問題很詳細的探討。
?
另外再附兩個鏈接,請注意時效性:
博文視點
《編程之美》出版方,收錄了一些問題的網友的解答。
薛迪的專欄
很多解題法被《編程之美》收錄。