Code Interview 解題原則

by 好豪
Published: Updated:

在 George Pólya 的數學著作《How to Solve It》中,提出了四個解數學題的原則:

  • 理解問題
  • 理解後,產生計畫(Devise a plan)
  • 實踐計畫
  • 回顧:修正與優化

這篇筆記則是 Colt Steele 在他的 Udemy 演算法課程 中,為 Code Interview 所改編的 Problem Solving 原則,這些都是需要準備面試的你平常練習寫程式題就需謹記在心的原則。

Step 1: 理解問題

  • 試著用自己的語言重述問題
  • 確認輸入與輸出分別長什麼樣子
    • 資料型別、輸出是否有限制等等
  • 確認是否有足夠資訊解題
    • 給定輸入,是否知道如何得到輸出結果
    • 如果沒有,該問的重要問題是什麼
    • 與面試官溝通題意不清的地方

Step 2: 探索實際範例

  • 確認自己知道輸入與輸出之間的關係
    • 先動手寫出三個簡單範例
    • 再列舉幾個較複雜的範例
    • 確認不合理輸入該有什麼輸出
      • NULL、超出定義域數值、空字串等等
  • 此步驟也準備了解題過程會用到的 Unit Test / Sanity Check

Step 3: 問題拆解

  • (用註解)明確寫出要執行的動作與順序
    • 口語化的 Pseudo Code
    • 建立寫 Code 前的骨架、實際著手寫 Code 才不會「迷路」
  • 時間有限的 Code Interview,這個步驟特別重要
  • 此步驟還有與面試官溝通的功能
    • Think out loud!
    • 就算 Code 來不及解完,只要寫出的 Pseudo Code 是對的,也至少向面試官展現自己依然有能力解題
    • 部分難題本來就是刻意讓你 Code 寫不完,如果連 Pseudo Code 都沒寫、就真的完全沒分數了

Step 4: 著手解題(或至少解出簡化問題)

  • 就是寫 Code
  • 如果解不出全部問題,先解一個簡化版本的問題
    • 劃分出問題中自己覺得最困難的部分,然後先忽略這部分,就成為簡化問題
      • 例如:只解特定一種類型的輸入、其他暫時忽略
      • 等簡化版問題解完,再來處理困難部分
    • 如果連簡化版問題都沒解,一片空白會看起來超蠢
    • 解決簡化版問題的過程,說不定會給自己解出困難問題的靈感

Step 5: 回顧與重構(Refactoring)

  • 檢視 Time / Space Complexity 為何,以及是否有優化空間
  • 檢查 Coding Style

聽起來還太抽象嗎?筆者好豪在 另一篇文章 用高手的模擬面試示範影片,介紹如何使用溝通技巧在面試中展現自己的解題流程,有興趣的讀者歡迎繼續閱讀:Coding Interview 請別忘記「溝通」


結語

Colt Steele 是 Udemy 上教寫程式著名的講師,這門課的步調適中、講師用圖示來講解演算法也很清楚,如果你對初學演算法刷題、或者 JavaScript 有興趣,這門課很值得一看。


如果你是正在用 Python 練習演算法刷題,筆者好豪寫過一些 Python 技巧心得文,我相信會對你有幫助!推薦閱讀:

推薦閱讀