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