Snowflake 是云数据仓库赛道的标杆公司,OA 题面也带着鲜明的「数据 infra」气质:不堆 brain teaser,但每道题都要求算法 + 复杂度 + 边界三项都达标。如果只过 sample case,hidden test 会无情地把你卡在 cutoff 之下。这篇文章把站内 Snowflake OA 三题实战版 没覆盖的两道真题级问题拆透:Unequal Elements 和 String Search。
题目一:Unequal Elements(k 次切换最长子序列)
题面:给定长度为 n 的技能序列 skills,每个元素表示一道题的技能类型。请找到最长的子序列,使得相邻元素之间不同技能切换次数 ≤ k。
注意:是「子序列」表述但 actually 是连续段(按提交方判断),所以更准确的描述是「最长的连续子段」。
关键思路:先压缩成 group,再滑动窗口
def max_subseq_with_k_transitions(skills: list[int], k: int) -> int:
if not skills:
return 0
# Step 1: 压缩相邻相同元素 → groups
groups = []
curr, count = skills[0], 1
for x in skills[1:]:
if x == curr:
count += 1
else:
groups.append((curr, count))
curr, count = x, 1
groups.append((curr, count))
# Step 2: 滑窗,窗口内不同 group 数 ≤ k+1(允许 k 次切换)
max_len = 0
left = 0
window_sum = 0
for right in range(len(groups)):
window_sum += groups[right][1]
while right - left > k:
window_sum -= groups[left][1]
left += 1
max_len = max(max_len, window_sum)
return max_len
复杂度:O(n)。
Hidden test 边界清单
k = 0且全数组同元素 → 返回 n(不是 0)k ≥ len(unique_skills) - 1→ 返回 nskills = []→ 返回 0- 单元素 → 返回 1
很多候选人卡在「窗口内不同 group 数 ≤ k+1」的 +1:k 次切换 = k+1 个连续段。这一项错了,所有 case 都跑不过。
题目二:String Search(有序删除后子序列保留)
题面:给一个 source 字符串和 target 字符串,按 order 数组指定的顺序逐个从 source 删除字符。求最大可删除前缀长度 k,使得删除前 k 个字符后 target 仍是 source 的子序列。
source = "abbabaa"
target = "bb"
order = [6, 0, 1, 4, 3, 2, 5]
关键思路:二分答案 + 子序列校验
直接模拟会爆 O(n²)。Snowflake 的 hidden test 输入规模 len(source) ≤ 10^5,必须二分。
def get_max_removals(order: list[int], source: str, target: str) -> int:
def is_subseq_after_remove(k: int) -> bool:
removed = [False] * len(source)
for i in range(k):
removed[order[i]] = True
t = 0
for i, ch in enumerate(source):
if not removed[i] and t < len(target) and ch == target[t]:
t += 1
if t == len(target):
return True
return t == len(target)
lo, hi, ans = 0, len(source), 0
while lo <= hi:
mid = (lo + hi) // 2
if is_subseq_after_remove(mid):
ans = mid
lo = mid + 1
else:
hi = mid - 1
return ans
复杂度:O(n log n)。
单调性证明(面试常追问)
Why does binary search work?
如果删除 k 个字符后 target 仍是 subsequence,那么删除 k-1 个字符(subset)后必然也是 subsequence。即「可行性」对 k 单调递减,可二分。这一点要主动讲,Snowflake reviewer 会扣「没解释为什么二分」的分。
Hidden test 边界清单
target是空串 → 任意 k 都成立,返回len(source)source == target且order含 target 中字符位置 → 返回 0 或更小order包含重复值 → 题面假设不重复,但 hidden case 可能塞重复- 极限:
len(source) = 1, target = ""→ 返回 1
双题对比:思维模型差异
| 维度 | Unequal Elements | String Search |
|---|---|---|
| 核心算法 | 滑动窗口 | 二分答案 + 子序列校验 |
| 复杂度 | O(n) | O(n log n) |
| Hidden test 主要陷阱 | k+1 而不是 k | 二分边界 / 空 target |
| 面试官常追问 | 为什么压缩成 group | 为什么具有单调性 |
Snowflake 这两题最有意思的地方在于:算法本身不难,但**「证明 / 解释」环节占评分权重**。OA 平台无法直接评估解释,但 follow-up phone screen 几乎必问,所以 OA 阶段的代码注释要写明白。
OA 节奏(90 分钟版)
00:00 - 00:05 通读 3 题,挑最熟的开头
00:05 - 00:25 Q1(最熟)→ 100% AC
00:25 - 00:55 Q2(中等)→ 80%+ AC,留 10 分钟兜底
00:55 - 01:20 Q3(最难)→ 优先 brute force 拿部分 case
01:20 - 01:30 回扫所有题的边界 case 提交
如果 OA 三道题里出现了 Unequal Elements 或 String Search,优先做这两题——它们的 sample case 较薄但 hidden test 严苛,AC 率直接决定通过。
OA 辅助怎么对接 Snowflake
Snowflake OA 这一关,OA 辅助 / OA代面 的标准节奏:
- 题型预判:从 hidden recruit 信号判断是 Snowflake / Databricks / Palantir 哪一家的题库(三家共享部分题源)
- 限时 mock:90 分钟仿真,重点训「先 brute → 再优化」的提交节奏
- 现场 cue:OA 当天后台同步推算法骨架 + hidden test 边界提示
- 复盘:每题提交后 5 分钟内回放,定位丢分边界
- Phone screen 衔接:OA 通过后立刻整理「单调性 / 复杂度证明」答案模板
FAQ
Q1: Snowflake OA 多久能出结果? A: 一般 3-7 个工作日。Snowflake 不会主动告知分数,只发 phone screen 邀请或拒信。
Q2: 三道题里允许部分 AC 吗? A: 允许,但 cutoff 大约在「1 全 AC + 2 部分 case」附近。三题全 AC 几乎稳过。
Q3: 必须用 Python 吗? A: 不强制。Snowflake 平台支持 Python / Java / C++ / Go。考虑到 String Search 这类二分答案题,Python 写起来最快。
Q4: 有面试官实时观察 OA 吗? A: 没有,是异步评测。但提交记录会保留供 phone screen 时回看。
Q5: OA 之后还有几轮? A: 通常 1 轮 phone screen + 4-5 轮 onsite。phone screen 会 50% 概率回到 OA 题,要求口头讲思路。
写在最后
Snowflake OA 真正的难点是「算法 OK 但解释不到位」——你做对了,却没说出为什么。如果你正在备考 Snowflake、Databricks 或 Palantir 的数据 infra 岗位,可以微信 Coding0201 联系,发岗位 JD + OA 邀请截图,先做题库判定,再排 OA 辅助节奏。
需要面试真题? 立刻联系微信 Coding0201,获取真题。
联系方式
- 微信:Coding0201
- Email: [email protected]
- Telegram: @OAVOProxy