頂尖科技公司的面試核心是演算法解題題:評估你解決從未見過的問題的能力。一場 45 分鐘往往只解一道題,全程要大聲思考。面試官跳進來給提示是正常的,不代表你表現差。

評估的五個面向#

面試官不照量化評分表,而是綜合整體印象:

  • 分析能力 — 需要多少協助?解法夠不夠優化?能否權衡不同決策?
  • 程式能力 — 能否正確轉成程式碼?是否整潔、考慮錯誤?
  • CS 基礎 — 是否具備扎實的資料結構與演算法知識?
  • 經驗 — 是否做過好的技術決策、有挑戰性的專案?
  • 溝通與文化契合 — 表達是否清楚?個性是否合適?

評分是相對的:面試官拿你和被問過同一題的其他人比較。拿到難題不要慌——對你難,對別人也一樣難。難易度本身不影響你的相對表現。

七步解題流程#

flowchart LR
    L[聆聽] --> E[畫例子] --> B[暴力解]
    B --> O[最佳化] --> W[走一遍] --> I[實作] --> T[測試]

    style B fill:#fff3e0,stroke:#ef6c00
    style O fill:#e3f2fd,stroke:#1565c0
    style T fill:#e8f5e9,stroke:#2e7d32
  1. 仔細聆聽 — 記住題目所有獨特資訊。「兩個已排序陣列」「在伺服器上重複執行」這些線索往往是最優解的關鍵。
  2. 畫一個好例子 — 具體(用真實數字)、夠大(比直覺多 50%)、不是特殊情況。
  3. 說出暴力解 — 別跳過,即使很明顯。說明其時間/空間複雜度,再談改進。
  4. 最佳化 — 見下方技巧。
  5. 走一遍 — 確定最優解後先別寫程式碼,完整走過演算法,確認每個細節。
  6. 實作 — 從白板左上角開始,寫出正確、高效、簡單、易讀、可維護的程式碼。
  7. 測試 — 概念測試 → 注意可疑行(如 length - 2)→ 熱點(遞迴 base case、整數除法、null 節點)→ 小測試案例 → 特殊情況。

好工程師不假設輸入合法。若錯誤檢查很繁瑣,可以說「我會在這裡寫這些檢查」並留空間,先完成主要邏輯。

最佳化技巧#

Look for BUD#

最有用的最佳化框架,找三種浪費:

  • Bottlenecks(瓶頸):拖慢整體的部分。例如「搜尋」是瓶頸 → 用 hash table 把 O(N) 搜尋變 O(1)。
  • Unnecessary Work(不必要的工作):可省略的計算,例如把最內層迴圈用公式直接算出。
  • Duplicated Work(重複的工作):反覆計算相同東西 → 預先算好放進 hash map 查表。

其他技巧#

技巧做法
DIY把問題想成真實例子,直覺手動解,再逆向工程成演算法
Simplify & Generalize先簡化限制(string→character)解出,再推廣回去
Base Case and Build解 n=1,從 n-1 推 n,常自然導向遞迴
資料結構腦力激盪逐一套用各種資料結構,看哪種最合適

「追蹤隨機數的中位數」用兩個 heap(一個 max-heap 管小半、一個 min-heap 管大半)最棒。做的題越多,選對資料結構的直覺越準。

最佳可想像執行時間(BCR)#

BCR 是你能合理想像的最快解法,描述任何演算法都無法突破的理論下界(找兩個陣列共同元素的 BCR 是 O(A+B),因為至少要看過每個元素一次)。

BCR 與 Best Case Runtime 完全不同。BCR 針對「問題」,Best Case 針對「特定演算法」且幾乎沒用。

用途:告訴你還有多少優化空間(已達 BCR 就轉攻空間複雜度);提示要消除什麼因子(BCR 是 O(N) 但你是 O(N log N) → 要幹掉那個 log N);BCR 以內的工作都是「免費的」。

面對錯誤與卡關#

面試最危險的謠言是「每題都要全對」。其實評估是綜合的:解法多優、花多久、需多少提示、程式碼多乾淨——而且是相對比較。拿到 offer 的人也幾乎都犯過錯。

  • 聽過這題 → 誠實告訴面試官。否則剝奪了他評估你的機會,被發現還扣誠信分;承認反而加分。
  • 語言選擇 → 選你最熟悉的。熟悉度比語言特性重要;若可選,普及、易讀的語言(Java/Python/C++)讓面試官好懂。
  • 卡住 → 對解難題表現出興奮感會加分。面試在測:面對困難你是迎難而上還是退縮?

從公司角度,false positive(誤招)比 false negative(漏掉好人)更可怕,所以面試刻意設計得寧可漏掉好人。被拒不代表你不是好工程師——很多優秀工程師只是不擅長這種測驗。多數公司樂於重新面試被拒者(通常等 6 個月到 1 年)。