Uber 2025 校招 Mobile Engineer I OA 复盘:3 道高频题拿分模板(滑窗/单调栈/排列区间)+ 2026 上岸案例
这套 OA 的特点很典型:题面不难、边界很多、非常吃“模板熟练度”。 如果你目标是一次过筛,这篇复盘会直接给你可复用的解题框架和实战节奏。
目录
题目全景与拿分顺序
| 题目 | 核心方法 | 时间复杂度 | 面试高频坑 |
|---|---|---|---|
| 连续 k 月严格递增区间计数 | 一次遍历 + 连续递增长度 | O(n) | k=1、k>n、重复计数 |
商品折扣(右侧首个 <=) data-preserve-html-node="true" |
单调栈(从右往左) | O(n) | <= data-preserve-html-node="true" 写成 <、索引输出顺序 data-preserve-html-node="true" |
| 平衡 k 判定 | 值到位置映射 + 区间跨度 | O(n) | 定义歧义未确认、1-based/0-based 混用 |
推荐做题顺序:题1 -> 题2 -> 题3。先拿稳定分,再冲思维题。
题 1:长度 k 严格递增区间计数
题意:统计长度为 k 的连续子数组里,满足“严格递增”的区间个数。
关键观察:
如果当前位置作为右端点的连续递增长度是 run,那么当 run >= k 时,以它结尾恰好贡献 1 个长度为 k 的有效区间。
from typing import List
def count_high_profit_intervals(stock_prices: List[int], k: int) -> int:
n = len(stock_prices)
if k <= 1:
return n
if k > n:
return 0
ans = 0
run = 1 # 当前以 i 结尾的严格递增长度
for i in range(1, n):
if stock_prices[i] > stock_prices[i - 1]:
run += 1
else:
run = 1
if run >= k:
ans += 1
return ans
样例:[5,3,5,7,8], k=3,输出 2。
题 2:右侧首个小于等于元素折扣
题意:每个价格减去其右侧第一个 <= data-preserve-html-node="true" 它的价格;若不存在则原价。
给定样例 prices=[2,3,1,2,4,2],总价为 8,全价索引为 [2,5]。
标准做法:从右到左维护单调递增栈(存索引)。
from typing import List, Tuple
def final_price_and_full_indices(prices: List[int]) -> Tuple[int, List[int]]:
n = len(prices)
stack: List[int] = []
full_indices: List[int] = []
total = 0
for i in range(n - 1, -1, -1):
while stack and prices[stack[-1]] > prices[i]:
stack.pop()
if stack:
total += prices[i] - prices[stack[-1]]
else:
total += prices[i]
full_indices.append(i)
stack.append(i)
full_indices.reverse()
return total, full_indices
这题最容易挂在一个字符:必须是 <=,不是 data-preserve-html-node="true" <。 data-preserve-html-node="true"
题 3:平衡 k 判定(排列子数组)
题意:对每个 k,是否存在长度为 k 的子数组,恰好是 {1..k} 的一个排列。
在“排列数组”前提下,可转化为:1..k 的位置最小值和最大值是否满足 max_pos - min_pos + 1 == k。
from typing import List
def balanced_k_bits(p: List[int]) -> str:
n = len(p)
pos = [0] * (n + 1)
for idx, val in enumerate(p, start=1):
pos[val] = idx
mn = n + 1
mx = 0
bits = []
for k in range(1, n + 1):
mn = min(mn, pos[k])
mx = max(mx, pos[k])
bits.append("1" if mx - mn + 1 == k else "0")
return "".join(bits)
备注:论坛帖中该题样例存在录入歧义是常见现象。面试现场请先复述定义并确认,再编码。
2026 上岸案例(脱敏)
学员:L 同学,Android 方向,国内 211,本科应届。 时间线:
2026-01-11加入我们的 OA 冲刺服务。2026-01-11 ~ 2026-02-02完成 12 次定向刷题 + 4 次 45 分钟限时 Mock。2026-02-18通过 Uber New Grad Mobile OA。2026-03-03完成终面并拿到 Offer。
提升数据(同题型统计):
- 首次 AC 率:
41% -> 89% - 平均做题时间:
37 分钟 -> 19 分钟 - 边界错误率:
每场 3.2 个 -> 0.7 个
核心改进不是“刷更多题”,而是三件事:
- 固化模板(滑窗/单调栈/位置映射)
- 强制口述边界(先说后写)
- 模拟真实限时节奏(先稳分后冲难)
一周冲刺计划
- Day 1:只刷 O(n) 线性题,目标是“写完一次过样例”。
- Day 2:单调栈 6 题,统一右边界模板。
- Day 3:排列与区间映射 5 题,练定义澄清。
- Day 4:45 分钟 OA 模拟 1 套。
- Day 5:针对错题做“重写而不是重看”。
- Day 6:45 分钟 OA 模拟 1 套。
- Day 7:整理个人模板库和口述脚本。
预约 1v1 复盘
你将拿到:
- 你的题型短板雷达图
- 7 天冲刺清单(按你投递公司定制)
- 一份可直接背诵的“边界口述模板”
面试救急
如果你 72 小时内 就要笔试/面试,直接走「面试救急」通道:
- 90 分钟极速诊断(算法 + 沟通)
- 当天可约 1 次高压模拟
- 现场修正你的超时与边界错误习惯