
這篇只保留面經內容,聚焦一題真實 Waymo 面試題。難點不在語法,而是在有限時間內做出正確決策、接住追問,並清楚說明解法依據。
題目原話
面試官給的核心問題是:
「你有另一個長度為 K 的權重陣列 M。在 Q1 的第 i 次 pop 時,被選中的元素分數要乘上 M[i]。你能拿到的最大分數是多少?」
面試情境可這樣理解:
Q1是可被選取的元素集合。- 總共執行
K次 pop。 - 第
i次選到的值會乘以M[i]。 - 目標是最大化總得分。
面試中的第一反應
常見起手式:
Q1由大到小排序M由大到小排序- 大值配大權重
這能很快給 baseline,但面試官通常會接著問:
- 你有沒有做不必要的全量排序?
- 如果
K遠小於Q1長度,如何優化? - 如果
Q1是串流資料,怎麼處理?
關鍵在於從「把全部都排好」轉成「只維護當下最有價值的資訊」。
主解法:貪心 + 堆
在允許重排配對順序的前提下,主解法是:
- 先把權重
M依降序處理。 - 使用最大堆維護
Q1中可選值。 - 每一步取堆頂最大值,乘上當前最大權重並累加。
這個回答在面試中很穩,因為同時覆蓋:
- 選擇策略(為何每步取最大)
- 資料結構(為何用堆)
- 複雜度(為何可擴展)
複雜度可表述為:
- 建堆
O(N)(或O(N log N),依建堆方式) K次彈出O(K log N)- 總體
O(N + K log N)或O((N + K) log N)
真實追問與回答方向
1)若 K << N,怎麼優化?
可答:
- 避免反覆全量排序。
- 用堆只做必要的最大值提取。
- 可補充 partial selection(如 quickselect/nth-element)。
2)若 Q1 是串流資料,怎麼做?
可答:
- 維護一個大小為
K的 Top-K 結構。 - 用最小堆保留目前最大的
K個值。 - 每筆新資料以
O(log K)更新。
3)除了貪心,還有其他方法嗎?
可答:
- 可提 DP 作為延伸(當約束改變時)。
- 但要說明 DP 的狀態與時間成本通常更高。
- 在目前目標下,貪心更直接且效率更好。
現場寫碼常見失誤
- Python
heapq預設是最小堆,做最大堆需取負值。 - 權重順序沒和貪心規則對齊,導致結果偏小。
- 忽略
len(Q1) < K的邊界情況。 - 沒交代負值或負權重時的行為定義。
- 寫完程式但沒有補最優性說明。
最優性怎麼講更穩
可用簡短交換論證:
- 較大的未使用權重應匹配較大的未使用值。
- 若把大值放在小權重位置,交換後總分不會更差。
- 重複交換後,會得到「大配大」的配對結構。
- 堆只是高效實現這個選擇規則的工具。
這題真正考的是什麼
這題表面是 Heap + Greedy,實際考察更全面:
- 能否先快速給出正確 baseline
- 能否在追問下迭代成更佳方案
- 能否清楚解釋複雜度與最優性
- 能否在壓力下維持清楚表達
在 Waymo 這類 VO 面試中,寫出正確答案只是起點,能清楚推導、穩定應對追問才是關鍵。
如果你也在準備 Waymo / Google / Amazon 的 OA 或 VO,想要更有系統的題型拆解、追問應對與表達優化,歡迎透過網站聯繫,取得備考資料與練習建議。
需要面試真題? 立刻聯繫微信 Coding0201,獲得真題。
聯繫方式
Email: [email protected]
Telegram: @OAVOProxy