3K
在 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 有興趣,這門課很值得一看。
- 好豪的課程心得:輕鬆自學 JavaScript 演算法與資料結構 — Udemy 課程心得
- 課程連結:Udemy – JavaScript Algorithms and Data Structures Masterclass
如果你是正在用 Python 練習演算法刷題,筆者好豪寫過一些 Python 技巧心得文,我相信會對你有幫助!推薦閱讀: