← 返回部落格列表 Snowflake OA 真題深挖:Unequal Elements + String Search 雙題硬核拆解
Snowflake

Snowflake OA 真題深挖:Unequal Elements + String Search 雙題硬核拆解

2026-05-31

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 邊界清單

很多候選人卡在「視窗內不同 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 邊界清單

雙題對比:思維模型差異

維度 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代面 的標準節奏:

  1. 題型預判:從 hidden recruit 訊號判斷是 Snowflake / Databricks / Palantir 哪一家的題庫(三家共享部分題源)
  2. 限時 mock:90 分鐘擬真,重點訓「先 brute → 再優化」的提交節奏
  3. 現場 cue:OA 當天後台同步推演算法骨架 + hidden test 邊界提示
  4. 覆盤:每題提交後 5 分鐘內回放,定位丟分邊界
  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取得真題


聯絡方式