← 返回博客列表 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获取真题


联系方式