Uber 校招 Mobile Engineer OA 深度复盘:105 分钟三题拆解与第三题 O(n) 最优解(附 2026 上岸案例)
核心结论先说:这场 OA 的分水岭不在语法,而在你能否快速识别“排列 + 区间”不变量。第三题用 min/max 位置区间扩张,O(n) 可过 2*10^5。
目录
- 一、考情速览
- 二、题 1:LeetCode 696(送分但别超时)
- 三、题 2:单调栈(中等偏难)
- 四、题 3:Balanced Numbers(真正拉开差距)
- 五、105 分钟实战时间分配
- 六、2026 上岸案例:14 天冲刺拿下
- 七、立即预约:1v1 OA 诊断
- 面试救急
一、考情速览
- 平台:HackerRank
- 时长:105 分钟
- 题量:3 题
- 体感难度:中等偏难,第三题偏难
- 申请地:Toronto, Canada
这类校招 OA 的典型结构是:1 道热身 + 1 道模板变体 + 1 道判定型难题。你的目标不是“每题都写最优雅”,而是“每题都一次 AC”。
二、题 1:LeetCode 696(送分但别超时)
题型是经典 Count Binary Substrings。
最稳做法:统计相邻分组长度,答案累加 min(prev_group, curr_group)。
- 时间复杂度:
O(n) - 空间复杂度:
O(1)(只存前后组长度)
常见失误:直接枚举子串,复杂度爆炸。
三、题 2:单调栈(中等偏难)
原帖没给完整题面,但从“单调栈”判断,本质多半是“最近更大/更小 + 一次遍历”。
实战建议:
- 先判断你要的是“下一个更大”还是“下一个更小”。
- 栈里放“索引”而非值,便于回填答案。
- 相等元素的处理要先定规则(
>还是>=),否则样例过、隐藏用例挂。
四、题 3:Balanced Numbers(真正拉开差距)
题意简化:
给定排列 p(1..n 各出现一次)。对每个 k,判断是否存在某个子数组恰好是数字 1..k 的一个排列。
关键不变量
设 pos[x] 是数字 x 在 p 中的位置。
k 是 balanced,当且仅当:
max(pos[1..k]) - min(pos[1..k]) + 1 == k
为什么成立:
- 如果某段子数组是
1..k的排列,那么这k个数字的位置必落在一个长度为k的连续区间内。 - 反过来,如果这
k个数字的位置跨度正好为k,由于排列里元素唯一,这个区间必然恰好装下1..k,不会多也不会少。
所以可以从 k=1..n 递推维护区间最小/最大位置,线性出答案。
可提交 Python 代码
def countBalancedNumbers(p):
n = len(p)
pos = [0] * (n + 1)
for i, v in enumerate(p, start=1):
pos[v] = i
ans = ['0'] * n
mn = n + 1
mx = 0
for k in range(1, n + 1):
idx = pos[k]
if idx < mn:
mn = idx
if idx > mx:
mx = idx
if mx - mn + 1 == k:
ans[k - 1] = '1'
return ''.join(ans)
- 时间复杂度:
O(n) - 空间复杂度:
O(n)
示例 p = [4, 1, 3, 2] 输出 1011。
五、105 分钟实战时间分配
0-8分钟:快速读完三题,锁定先后顺序。8-25分钟:拿下题 1,确保一次通过。25-60分钟:主攻题 2,优先过边界。60-95分钟:做题 3,先写判定核心,再补输入输出。95-105分钟:统一回归测试,重点测n=1、升降序、极限长度。
六、2026 上岸案例:14 天冲刺拿下
候选人:L 同学,国内双非,Android 实习 1 段,目标加拿大校招。 起点:首次模拟 OA 仅通过 1/3,第三题类型几乎不会。 我们给的方案:
- 第 1-4 天:单调栈与双指针高频题压缩训练。
- 第 5-9 天:排列不变量专题(位置映射、区间覆盖、前缀性质)。
- 第 10-14 天:3 套 105 分钟全真计时 + 逐题复盘模板。
结果:
- 2026-02-18 完成同类型 OA,三题全部通过。
- 2026-03-04 收到北美移动端校招 offer。
七、立即预约:1v1 OA 诊断
你将获得:
- 你的 OA 题型短板雷达图
- 2 周可执行刷题路径
- 针对目标岗位的真题优先级清单
面试救急
距离笔试不到 72 小时?
我们提供“面试救急”加速服务:当天完成能力评估、次日给出冲刺计划、第三天进行全真模拟与临场策略校准。
立即预约,优先插队排期:https://example.com/booking