Snowflake 的 OA 90 分钟、3 道题,没有性格题,全部用代码说话。题型乍看都是 LeetCode Medium,但 Snowflake 的 hidden test 会同时考察复杂度上限、矩阵 in-place 限制和输入输出格式——这三点没把握住,全 AC 也会丢分。这篇文章把三道高频经典题:Longest Consecutive Sequence、Group Anagrams、Rotate Image,按「思路 + 完整代码 + 边界踩坑」给出实战版。这是 Unequal Elements + String Search 深挖版 的姊妹篇。
OA 平台特征速读
| 维度 | Snowflake OA |
|---|---|
| 时长 | 约 90 min |
| 题量 | 3 道 coding |
| 平台 | HackerRank(自有题库 + 共享 Databricks/Palantir 部分题) |
| 评分 | 每题独立打分 + hidden case 隐性扣分 |
| 通过线 | 估约 75% AC + 2 题 100% AC |
| Cutoff 风格 | 重「正确性」轻「速度」 |
题目一:Longest Consecutive Sequence(O(n) 严格要求)
题面:给定无序整数数组,返回最长连续序列的长度。要求 O(n) 时间复杂度。
input = [100, 4, 200, 1, 3, 2]
output = 4 # [1, 2, 3, 4]
关键思路:HashSet + 起点判定
错的做法:先 sort 再扫描。复杂度 O(n log n),会被 hidden test 直接 TLE。
正确做法:用 set 存所有元素,对每个 x,只在 x-1 不在 set 时才向上扩展——这保证每段连续序列只被「头节点」启动一次,总时间 O(n)。
def longest_consecutive(nums: list[int]) -> int:
s = set(nums)
longest = 0
for x in s:
if x - 1 not in s: # x 是某段连续序列的起点
curr = x
length = 1
while curr + 1 in s:
curr += 1
length += 1
longest = max(longest, length)
return longest
复杂度:O(n)。边界:空数组返回 0;含重复值时 set() 自动去重。
Hidden test 踩坑
- 全相同元素:
[5, 5, 5]→ 返回 1 - 单元素:返回 1
- 数组长度 ≥ 10⁵:必须 O(n),O(n log n) 会 TLE
- 含负数 / 0:set 处理负数无问题,无需特殊路径
题目二:Group Anagrams(用计数 key 替代排序)
题面:给定字符串数组,把字母异位词归为一组返回。
input = ["eat","tea","tan","ate","nat","bat"]
output = [["eat","tea","ate"], ["tan","nat"], ["bat"]]
关键思路:构造 key
最直接:key = "".join(sorted(s))。但 sorted 是 O(L log L),n 个字符串总 O(n·L·log L)。
更优:26 长度的字符计数数组当 key(tuple 化方便 hash)。每个字符串 O(L) 构造 key,总 O(n·L)。
from collections import defaultdict
def group_anagrams(strs: list[str]) -> list[list[str]]:
groups = defaultdict(list)
for s in strs:
cnt = [0] * 26
for ch in s:
cnt[ord(ch) - ord('a')] += 1
groups[tuple(cnt)].append(s)
return list(groups.values())
复杂度:O(n·L)。
Hidden test 踩坑
- 空字符串
"":所有空字符串归为同一组(key = 全 0 tuple) - Unicode / 大写:题面假设小写字母,但 hidden case 可能塞
'A',最好对输入lower()防御 - 单字符串:返回
[[s]],不是[s] - 输出顺序无要求,但同组内字符串保持输入顺序
题目三:Rotate Image(in-place 90° 顺时针)
题面:给定 n×n 矩阵,原地旋转 90° 顺时针。禁止 O(n²) 额外空间。
input = [[1,2,3],
[4,5,6],
[7,8,9]]
output = [[7,4,1],
[8,5,2],
[9,6,3]]
关键思路:转置 + 每行翻转
两步走,每步 O(n²)、O(1) 额外空间:
- 转置(沿主对角线翻折):
matrix[i][j] ↔ matrix[j][i] - 每行翻转:
row[::-1]
def rotate(matrix: list[list[int]]) -> None:
n = len(matrix)
# Step 1: transpose
for i in range(n):
for j in range(i + 1, n):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
# Step 2: reverse each row
for row in matrix:
row.reverse()
复杂度:O(n²) 时间,O(1) 空间。
Hidden test 踩坑
- 转置时
j从i+1起,不是0,否则等于做了两次(白做) - 必须
row.reverse()而不是row = row[::-1]——后者改变局部引用、原矩阵不变 - 1×1 矩阵:直接返回(两步都是空操作)
- 矩阵不要返回,原地修改即可
三题对比:核心考点矩阵
| 题目 | 核心考点 | 时间复杂度 | 空间限制 |
|---|---|---|---|
| Longest Consecutive | HashSet 起点判定 | O(n) | O(n) |
| Group Anagrams | 计数 key 替代排序 | O(n·L) | O(n·L) |
| Rotate Image | 转置 + 行翻转 in-place | O(n²) | O(1) |
Snowflake 的 hidden test 在每道题上都明确卡了复杂度上限(O(n) 不能写 O(n log n))或空间限制(O(1) 不能临时开新矩阵)——这是与 LeetCode 提交不一样的地方。
OA 通关节奏(90 分钟)
00:00 - 00:05 快速读完 3 题
00:05 - 00:30 Q1:HashSet → 100% AC
00:30 - 00:55 Q2:字符计数 key → 100% AC
00:55 - 01:20 Q3:in-place 旋转 → 100% AC
01:20 - 01:30 跑边界(空 / 单元素 / 大输入),逐题再 submit 一次
节奏建议:每道题留 5 分钟边界扫描,比一开始就追求 100% 完美更稳。Snowflake 评分对最终提交版本生效,多次提交不扣分。
与 Unequal Elements / String Search 的题型横向对比
| 维度 | 本文三题 | Unequal / String Search |
|---|---|---|
| 难度 | LC Medium | LC Medium-Hard |
| 算法工具箱 | HashSet / Counter / 转置 | 滑动窗口 / 二分答案 |
| 解释要求 | 中等(说复杂度即可) | 高(需证明单调性 / 压缩思路) |
| Hidden test 严苛度 | 中 | 高 |
如果你抽到的是本文三道经典,一般做完时间还会剩 20+ 分钟,可以多花时间在边界。如果抽到 Unequal / String Search,时间会非常紧。
OA 辅助怎么对接 Snowflake
OA 辅助 / OA代面 的标准节奏:
- 题库识别:发邀请邮件截图,5 分钟内判定是「经典三题」还是「真题级两题」类型
- 限时 mock:按 90 分钟节奏练,重点是 in-place / O(n) 的限制感
- 现场 cue:OA 当天 reviewer 后台同步推骨架代码 + 边界提示
- 复盘:提交后 30 分钟内回放,整理面试官常追问点
- Phone screen 衔接:OA 通过后口头讲解模板(HashSet 单调性、in-place 步骤拆解)
FAQ
Q1: 我可以提交多少次? A: 不限次数。Snowflake 评分以最后一次提交为准,所以建议每题做完先 submit 一次保底,再优化。
Q2: 没要求 O(n) 的题用 O(n log n) 行不行? A: 行,但 Group Anagrams 用 sorted 写也能过。Longest Consecutive 必须 O(n),hidden case 会 TLE 拒绝 O(n log n)。
Q3: in-place 旋转能用 numpy.rot90 吗? A: 不行。Snowflake 平台默认禁用第三方加速库。必须手写转置 + 翻转。
Q4: 三道题做不完会被秒拒吗? A: 不一定。如果 Q1+Q2 全 AC + Q3 拿部分 case,仍有概率进 phone screen。但 Q1 没 AC 几乎必拒。
Q5: OA 后多久能进 onsite? A: 一般 OA 通过 → 1 周内 phone screen → 2-3 周内 onsite。整体 4-5 周完成全流程。
写在最后
Snowflake 这三道题如果在 LeetCode 上单独刷,平均 30 分钟一题。但 OA 场景里同时考察复杂度敏感度 + 边界扫描 + 提交节奏,这是 Snowflake 真正想看的。如果你正在准备 Snowflake / Databricks / Palantir 的 OA,可以微信 Coding0201 联系,发邀请截图,先做题库判定,再排 OA 辅助节奏。
需要面试真题? 立刻联系微信 Coding0201,获取真题。
联系方式
- 微信:Coding0201
- Email: [email protected]
- Telegram: @OAVOProxy