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