1. 程式人生 > >面試經典演算法題集錦——《劍指 offer》小結

面試經典演算法題集錦——《劍指 offer》小結

從今年 3 月份開始準備找實習,到現在校招結束,申請的工作均為機器學習/資料探勘演算法相關職位,也拿到了幾個 sp offer。經歷這半年的洗禮,自己的綜合能力和素質都得到了一個質的提升。

實話說對於未來去哪裡,即將如何發展還沒有清晰的規劃。迷茫總是會有的,但這並不是停止腳步的理由。找工作是在漫長的職業生涯中時常出現的轉折點,而學習和和積累是終生的任務。

 

在準備面試過程中手寫 bug free 程式碼的環節是必不可少的。本人並非 ACM 出身,雖說在學校基礎課程學得還不錯,但對於刷題並無太多經驗,一開始還是吃力的。慢慢的發現這一過程還是挺有意思的,雖然校招找工作已結束,但這刷演算法題會成為我新的愛好。最近將《劍指 offer》這本經典的面試寶典梳理了一遍,並實現和整理了書中的所有題目,並在“牛客網”上提交測試以保證程式碼的正確性。

平時有時間也可以刷一刷hihocoder,很多題目思考起來還是很有意思的。對於其他的課本,我覺得《演算法導論》《程式設計珠璣》《程式設計之美》都是不錯的經典教材,如果以後有時間也會一一對這幾本書進行總結。

對於刷題,談談我的幾點感受:

  1. 熟練一門程式語言很重要,這決定了你能不能將 idea 儘快實現並印證。在一開始可以先寫一些 easy 的題,主要是將自己的程式語言練熟。本人主要使用 c++ 實現,其實演算法涉及的結構不是很多,stl 基本就可以很好的 cover。
  2. 凡事開頭難,堅持總是會有收穫的。我建議刷題要有一個持續的過程,不要間斷,最好一段時間集中攻克一件事情。比如 x 天完成一本書,或者一塊內容,這樣有助於集中精力突破。如果三天打魚兩天晒網,每次撿起來都很吃力,會形成惡性迴圈。題目刷多了以後會培養出感覺和思考問題的思路。
  3. 無論簡單與否都要思考清楚再開始寫程式碼。分析題目時可以將問題進行分解,還可以藉助例項,做圖抽象等方法幫助理解。
  4. 注意細節,寫 bug free 的程式碼(應該成為一種追求)。實現程式碼過程中應該分析好輸入輸出,考慮好特殊情況和邊界條件等。比如字串轉換成整數需要考慮:不合法輸入,溢位等情況。使用指標時刻注意是否為空的判斷等。
  5. 優美,魯棒的高質量程式碼。不僅僅是追求完成功能,還應該對程式碼的佈局,變數名見名見意,關鍵邊界條件的檢查等。程式碼是程式設計師交流的語言,因此應該寫得優美
  6. 重複檢查,人腦 debug。無論是否在手寫程式碼的環境中,寫完程式碼都應該養成重複 review 的習慣,自己跑幾個測試用例,確定沒有問題之後再把你程式碼交給面試官。
  7. 沒有完美的程式碼,注意溝通完成滿足需求的程式碼。每一個程式都可以看成是輸入到輸出的對映過程,而輸入和輸出總是有很多可能的,我們一個程式不可能 cover 掉大千世界,函式 function,也可以叫做“功能”,即完成一定任務的函式,這就需要我們通過溝通去了解使用者的意圖,將問題抽象,並基於某些假設去完成這樣的 function。
  8. 解決問題的方法總是多樣的。不管是做題還是平時練習,在完成任務的基礎上應該還要發散性思考,一個題目的不同解法,相似題目的解法,相似場景的結局等。
  9. 在進行時間和空間複雜度分析時,要注意考慮實際使用的語言,其內建資料結構或函式的複雜度會影響你實際程式的複雜度。比如 C++ 中 map 和 unordered_map,set 和 unordered_set 的區別等。
  10. 一味的 practice,還要適時的總結和 review 才能及時的查漏補缺,讓自己能更好的成長。