程式題#
不是所有 PM 面試都會考程式題,但在 Google、Facebook 等技術導向的公司,程式能力是基本要求。即使不需要寫 production code,理解資料結構和演算法能幫你與工程師更好地溝通。
誰需要會寫程式?#
| 公司 | 程式面試要求 |
|---|
| Google | 幾乎所有 PM 都需要通過程式面試 |
| Facebook | 技術 PM 需要,一般 PM 也會被問基本題 |
| Microsoft | Program Manager 需要基本的程式能力 |
| Amazon | Technical PM 需要,一般 PM 較少 |
| Startups | 視產品性質而定,技術產品的 PM 通常需要 |
需要掌握的知識#
資料結構#
| 資料結構 | 核心概念 | 常用操作的時間複雜度 |
|---|
| Array | 連續記憶體、固定大小 | 存取 O(1)、搜尋 O(N) |
| Hash Table | Key-Value 對應 | 存取 O(1)、插入 O(1) |
| Linked List | 節點串連 | 存取 O(N)、插入 O(1) |
| Tree | 階層結構 | 搜尋 O(log N)(BST) |
| Stack | LIFO(後進先出) | Push/Pop O(1) |
| Queue | FIFO(先進先出) | Enqueue/Dequeue O(1) |
| Graph | 節點 + 邊 | 依實作方式不同 |
樹的重要概念#
| 類型 | 定義 |
|---|
| Binary Tree | 每個節點最多有兩個子節點 |
| Binary Search Tree(BST) | 左子節點 < 父節點 < 右子節點 |
| Balanced Tree | 樹的高度保持 O(log N) |

Binary Search Tree 範例:左子節點 < 父節點 < 右子節點
排序演算法#
| 演算法 | 平均時間複雜度 | 最差時間複雜度 | 空間複雜度 |
|---|
| Merge Sort | O(N log N) | O(N log N) | O(N) |
| Quick Sort | O(N log N) | O(N²) | O(log N) |
| Insertion Sort | O(N²) | O(N²) | O(1) |
| Bubble Sort | O(N²) | O(N²) | O(1) |
搜尋演算法#
| 演算法 | 說明 | 實作方式 |
|---|
| Binary Search | 在已排序的 array 中搜尋,O(log N) | 迭代或遞迴 |
| DFS(Depth-First Search) | 深度優先搜尋 | Stack |
| BFS(Breadth-First Search) | 廣度優先搜尋 | Queue |
Big O 表示法#
Big O 描述演算法效率如何隨輸入規模增長而變化:
| 複雜度 | 名稱 | 範例 |
|---|
| O(1) | 常數時間 | Array 存取 |
| O(log N) | 對數時間 | Binary Search |
| O(N) | 線性時間 | 遍歷 Array |
| O(N log N) | 線性對數 | Merge Sort |
| O(N²) | 平方時間 | 雙重迴圈 |
| O(2^N) | 指數時間 | 遞迴 Fibonacci |

O(N²) 的增長曲線:隨著 N 增大,執行時間急遽上升
重要觀念#

為什麼捨棄常數:y=x 與 y=x² 的增長差異遠大於常數倍數
- 多變數:如果有兩個獨立的輸入 A 和 B,寫成 O(A + B) 或 O(A × B)
- Log 與 Big O:每次將問題對半切,就是 O(log N)
- 空間複雜度:除了時間,也要考慮記憶體使用
遞迴(Recursion)#
- 每次遞迴呼叫都會在 call stack 中占用記憶體
- 遞迴深度 N 層 → 空間複雜度至少 O(N)
- 很多樹和圖的問題天然適合遞迴解法
面試中怎麼寫程式#
六步驟方法#
| 步驟 | 名稱 | 說明 |
|---|
| 1 | Clarify(釐清) | 確認你理解了問題和邊界條件 |
| 2 | Whiteboard(白板) | 用例子在白板上推演 |
| 3 | Talk Out Loud(大聲思考) | 讓面試官跟上你的思路 |
| 4 | Think Critically(批判思考) | 想想有沒有更好的方法 |
| 5 | Code Slowly(慢慢寫) | 寫清楚比寫快重要 |
| 6 | Test and Fix(測試修正) | 用例子跑一遍你的程式 |
發展演算法的策略#
六種策略
- Use an Example — 用具體例子推導通則
- Optimize Brute Force — 先寫暴力解,再優化
- Solve for Base Case — 先解決最簡單的情況,再擴展
- Think about Similar Problems — 這個問題和你解過的哪個問題相似?
- Simplify and Tweak — 簡化問題,解決簡化版,再處理完整版
- Record Insights — 記下推導過程中發現的任何規律
如何被評估#
面試官評估的面向:
| 評估面向 | 說明 |
|---|
| 問題理解 | 你是否正確理解了問題? |
| 演算法設計 | 你的方法是否高效? |
| 程式碼品質 | 邏輯清楚、命名合理、處理邊界條件 |
| 測試能力 | 你能不能自己找出 bug? |
| 溝通能力 | 你能不能清楚地解釋你的思路? |
PM 的程式面試通常不會像 Software Engineer 那麼難。重點是展現你的技術理解力和與工程師溝通的能力,而非寫出最優化的程式。