如果你是第一次準備 Uber OA,最容易卡住的不是題難,而是不知道平台長什麼樣、節奏怎麼分配、什麼樣的題目算「正常水準」。Uber 的 OA 整體是 LeetCode Medium 偏中等,但因為同一時間窗內會下發到 SDE / Data Engineer / Data Scientist 多條線,新手如果按錯誤的題型方向準備,就會浪費一大半時間。
這篇是站內首篇 Uber OA 入門級指南:先把「平台 + 時長 + 評分邏輯」講清楚,再給四道完全可練手的仿真題(不是站內已有的真題復盤),覆蓋前綴和、二元樹、並查集、DP 四個核心方向。讀完你應該能直接進入 90 分鐘模考狀態。
Uber OA 全景:平台、時長、題量
| 欄位 | 詳情 |
|---|---|
| 平台 | HackerRank(絕大多數批次) + 個別批次走 CodeSignal |
| 時長 | 90 分鐘(SDE) / 75 分鐘(DS, DE) |
| 題量 | 2-3 道程式設計 + 偶爾 5-10 道 MCQ |
| 程式語言 | Python / Java / C++ / Go 主流 |
| 評分邏輯 | 分數 = AC 測試案例數 / 總案例數;時間複雜度過 hidden case |
一條最重要的規則:HackerRank 的「執行」按鈕只跑前幾個 sample,通過 sample ≠ 通過提交——必須等「提交」後看到完整 hidden test 結果。
備考心態:什麼樣的水準算「夠格」?
| 自評維度 | 入門 | 合格 | 優秀 |
|---|---|---|---|
| LeetCode Medium AC 速度 | 30-40 分鐘 | 20-25 分鐘 | 12-15 分鐘 |
| 資料結構熟練度 | 3 種以下 | 5-6 種 | 8 種以上 |
| 邊界 case 主動思考 | 常忘 | 寫完後補 | 寫之前列 |
| 平台 IO 熟練度 | 抓瞎 | 能寫 | 模板化 |
結論:合格水準就足夠過 Uber OA。不需要把自己練到 LeetCode Hard 一血。
仿真題 1:前綴和——Trips 區間統計
給定 N 天每天的訂單數
trips[],給 Q 個查詢(l, r),回傳區間[l, r]的訂單總和。N, Q ≤ 1e5。
思路:經典前綴和。
def range_trip_sum(trips, queries):
pref = [0] * (len(trips) + 1)
for i, t in enumerate(trips):
pref[i+1] = pref[i] + t
return [pref[r+1] - pref[l] for l, r in queries]
時間複雜度:預處理 O(N),每次查詢 O(1)。 練習目標:在 5 分鐘內寫出來。
仿真題 2:二元樹——城市路徑重建
輸入一個序列化字串
"1,2,#,3,#,#,4,#,#"(前序 + null 標記#),重建二元樹,回傳根節點。
思路:用迭代器消費 token,遞迴構建。
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def deserialize(data: str):
tokens = iter(data.split(','))
def build():
v = next(tokens)
if v == '#':
return None
node = TreeNode(int(v))
node.left = build()
node.right = build()
return node
return build()
時間複雜度:O(N)。
練習目標:理解為何要用 iter 而不是索引。
仿真題 3:並查集——司機網路連通性
給 N 個司機 + M 條互相認識的關係。問最大的認識群體大小。
思路:union-find + 計數 root size。
class DSU:
def __init__(self, n):
self.p = list(range(n))
self.sz = [1] * n
def find(self, x):
while self.p[x] != x:
self.p[x] = self.p[self.p[x]]
x = self.p[x]
return x
def union(self, a, b):
ra, rb = self.find(a), self.find(b)
if ra == rb:
return
if self.sz[ra] < self.sz[rb]:
ra, rb = rb, ra
self.p[rb] = ra
self.sz[ra] += self.sz[rb]
def largest_group(n, edges):
d = DSU(n)
for a, b in edges:
d.union(a, b)
return max(d.sz[d.find(i)] for i in range(n))
時間複雜度:近似 O(α(N) · M)。 練習目標:在 8 分鐘內寫出 path compression + union by size。
仿真題 4:DP——Surge Pricing 最大化
給 N 個時段每個時段加價係數
mul[i],要求選出 K 個不相鄰時段,最大化加價係數之和。
思路:經典「打家劫舍」擴充到 K 選不相鄰。
def max_surge_choices(mul, K):
n = len(mul)
NEG = float("-inf")
dp = [[NEG]*(K+1) for _ in range(n+1)]
for i in range(n+1):
dp[i][0] = 0
for i in range(1, n+1):
for k in range(1, K+1):
dp[i][k] = dp[i-1][k]
if i >= 2:
dp[i][k] = max(dp[i][k], dp[i-2][k-1] + mul[i-1])
else:
dp[i][k] = max(dp[i][k], mul[i-1])
return dp[n][K]
時間複雜度:O(N·K)。 練習目標:能在 12 分鐘內推導轉移方程並寫出來。
90 分鐘節奏推薦
| 時間段 | 任務 |
|---|---|
| 0-5 分鐘 | 通讀所有題面,按「我能多快做出」打分 |
| 5-30 分鐘 | 先做最有把握的一題,爭取 100% AC |
| 30-65 分鐘 | 第二題,先暴力解過 sample,再優化 |
| 65-85 分鐘 | 第三題(如果有),寫到能 AC 一半即停 |
| 85-90 分鐘 | 檢查所有提交、關閉瀏覽器前確認 |
OA 之後:還有哪些坎?
| 階段 | 內容 | 時長 |
|---|---|---|
| Recruiter Screen | 行為 + 專案深挖 | 30 分鐘 |
| Tech Phone | 演算法 medium + 簡單系統 | 45 分鐘 |
| Onsite | 4-5 輪:演算法 + 系統 + 行為 + Hiring Manager | 1 個工作日 |
FAQ
Q1:Uber OA 通過率大致多少? 官方未公布,社群估算 30-40%。兩道題接近全 AC 的同學幾乎都能進 Tech Phone。
Q2:HackerRank 平台 IO 怎麼寫最穩?
建議用 sys.stdin.readline + sys.stdout.write,比 input() / print() 快 5-10 倍,但別忘了 strip()。
Q3:如果第一題卡 30 分鐘還沒出 sample,怎麼辦? 立刻切到第二題。Uber OA 評分按 AC 案例數累加,先 AC 一半優於卡死一題。
Q4:DS / DE 路線和 SDE 一樣難嗎? DS / DE 的 OA 多了 SQL 與 Pandas 題,時長少 15 分鐘。演算法題數量減少,但SQL 經常是 hard window function。
Q5:Uber OA 之後多久收 Tech Phone? 通常 5-10 個工作日。HM hold 等情況 會延到 3 週。
正在準備 Uber OA?
如果你剛收到 OA 連結但擔心 90 分鐘節奏拿不下,或者想要面試日真人 OA代面 / VO代面 全程陪跑,可以聊聊看完整的 OA輔助 / VO輔助 方案。
聯絡方式
需要面試真題與客製備戰計畫?立刻聯絡微信 Coding0201,獲取真題。
Email: [email protected] Telegram: @OAVOProxy