如果你是第一次准备 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