← 返回博客列表
Uber

Uber 面試真題復盤:拓樸排序暗藏殺機?

2025-09-04

🔥 剛剛結束的一場 Uber SDE 面試實錄

在這場 Uber 的技術面試中,我們的客戶遇到了一道極其經典但「陷阱重重」的題目——構建軟體包依賴順序 (Package Build Order)。

這道題乍看之下只是簡單的圖遍歷,但實際上對 拓樸排序 (Topological Sort) 的理解要求極高。很多候選人容易陷入 BFS 層級遍歷誤區,導致無法正確處理深層依賴順序,最終程式碼越寫越亂、結果不對。

而這位客戶,在 oavoservice 的全程即時協助下,不僅糾正了初始的錯誤思路,還寫出了結構清晰、邏輯完美的解法,贏得了面試官的高度肯定,順利晉級。


📄 題目原文還原

Given a package name, return the build order of its package dependencies. If package A depends on package B (A -> B), then B must be built before A.

範例邏輯:


🛑 「BFS 層級遍歷」的陷阱

很多候選人直覺反應是:「我只需要找到所有依賴,一層一層往下找不就行了嗎?」

錯誤思路 (BFS):

  1. 找到 Service 的依賴 -> [Core, Utils]
  2. 先構建 Core, Utils
  3. 再找 Core 的依賴 -> [Types]...

致命缺陷: 如果 Utils 也依賴 Types (Utils -> Types),BFS 可能會導致 UtilsTypes 之前 被構建!這違反了構建規則。

正確模型: 這是一個有向無環圖 (DAG) 的 拓樸排序 問題。


✅ oavoservice 即時指導全過程

第一階段:破題與建模 (Clarification)

oavoservice 提示:

"別用 BFS 分層。這是依賴解析問題,你需要 Topological Sort。" "跟面試官確認:是否有循環依賴 (Circular Dependency)?" (如果有,需要處理環檢測)。

第二階段:程式碼實作 (DFS Post-order)

我們引導客戶使用 DFS 後序遍歷,因為它天然符合「先構建依賴,再構建自己」的邏輯。

核心邏輯:

  1. 要構建 A,先遞迴訪問 A 的所有子節點。
  2. 子節點都訪問完後,將 A 加入 result 列表。
  3. 使用 visited 集合避免重複計算和檢測環。

程式碼片段:

def get_build_order(package, dependencies):
    visited = set()
    building = set()  # 檢測環
    order = []

    def dfs(node):
        if node in building:
            raise ValueError("Cycle detected!")
        if node in visited:
            return
        
        building.add(node)
        for dep in dependencies.get(node, []):
            dfs(dep)
        
        building.remove(node)
        visited.add(node)
        order.append(node)

    dfs(package)
    return order

第三階段:Follow-up 與優化

面試官:「如果我們想並行構建怎麼辦?」

oavoservice 提示:

"提到 Kahn's Algorithm (基於入度的拓樸排序)。入度為 0 的節點可以並行構建。"


🎓 為什麼選擇 oavoservice?

無論你面對的是 Uber, Amazon, Meta 還是 TikTok,oavoservice 都是你最穩的技術後盾。


需要面試輔助服務?聯繫我們

需要面試真題? 立刻聯繫微信 Coding0201獲得真題