← 返回博客列表 Snowflake Coding 高频题全解析:数组 + 字符串 + 图 + 数据流
Snowflake

Snowflake Coding 高频题全解析:数组 + 字符串 + 图 + 数据流

2026-06-07

Snowflake 的 coding 面试很有特色:不追求极端冷门题,也不停留在简单套路。出题往往来自常见的 LeetCode 中等题,但考察深度很高——面试官更看重你能否在短时间内给出最优解,并清楚解释"为什么这是最优"。只靠暴力解哪怕跑通测试用例,往往也拿不到高分。

这篇文章把 Snowflake 高频题归纳成四大模块:数组、字符串、图、数据流,逐题给出 Python 最优解、复杂度,以及面试官最爱追问的"为什么"解释逻辑。

Snowflake Coding 面试速查表

维度 详情
平台 CoderPad / 自带 IDE(VO 阶段)
时长 单轮 45 分钟,1-2 题
难度 LeetCode 中等为主,偏上
考察重点 最优解 + 复杂度解释 + 代码健壮性
高频模块 数组、字符串滑窗、图搜索、堆/数据流

题型一:数组——最大容器面积(双指针)

题目描述

给定 N 条垂直线的高度,选两条与 x 轴围成容器,求能容纳的最大水量。

解题思路

暴力枚举所有线对是 O(n²),真实场景不可接受。Snowflake 希望你立刻想到双指针:左右指针向中间收缩,每次移动较矮的一侧。

Python 解法

def max_area(height):
    left, right = 0, len(height) - 1
    best = 0
    while left < right:
        h = min(height[left], height[right])
        best = max(best, h * (right - left))
        # 移动较矮一侧,因为面积受限于较矮的线
        if height[left] < height[right]:
            left += 1
        else:
            right -= 1
    return best

为什么最优:移动较高的一侧不可能让面积变大(宽度减小、高度仍受限于矮侧),所以只需单向收缩,O(n) 一遍扫描即可。

时间复杂度:O(n) 空间复杂度:O(1)

题型二:字符串——最小覆盖子串(滑动窗口)

题目描述

给定字符串 s 和 t,找出 s 中包含 t 所有字符的最短子串。

解题思路

滑动窗口 + 哈希计数。右指针扩张直到覆盖 t,再收缩左指针求最短。关键在于正确维护窗口边界,避免 off-by-one。

Python 解法

from collections import Counter

def min_window(s, t):
    need = Counter(t)
    missing = len(t)
    left = start = 0
    end = float('inf')
    for right, ch in enumerate(s):
        if need[ch] > 0:
            missing -= 1
        need[ch] -= 1
        while missing == 0:                 # 窗口已覆盖 t
            if right - left < end - start:
                start, end = left, right
            need[s[left]] += 1
            if need[s[left]] > 0:
                missing += 1
            left += 1
    return "" if end == float('inf') else s[start:end + 1]

为什么用 Counter 而非定长数组:t 可能含任意字符,Counter 更通用;若限定小写字母,定长数组常数更小。面试时主动说明这个取舍是加分点。

时间复杂度:O(|s| + |t|) 空间复杂度:O(|t|)

题型三:图——课程表(拓扑排序检测环)

题目描述

给定课程数和先修依赖 prerequisites,判断能否修完所有课程(即依赖图是否有环)。

解题思路

Snowflake 的核心系统有复杂分布式依赖,图论题高频。用 Kahn 拓扑排序:入度为 0 的节点逐层出队,最终出队数 < 课程数即有环。

Python 解法

from collections import deque, defaultdict

def can_finish(num_courses, prerequisites):
    graph = defaultdict(list)
    indegree = [0] * num_courses
    for course, pre in prerequisites:
        graph[pre].append(course)
        indegree[course] += 1
    queue = deque(i for i in range(num_courses) if indegree[i] == 0)
    visited = 0
    while queue:
        node = queue.popleft()
        visited += 1
        for nxt in graph[node]:
            indegree[nxt] -= 1
            if indegree[nxt] == 0:
                queue.append(nxt)
    return visited == num_courses

为什么 Kahn 而非 DFS:两者都可,但 Kahn 用入度天然避免递归栈深度问题,且更易解释"为什么能检测环"——无法清空队列就说明存在循环依赖。

时间复杂度:O(V + E) 空间复杂度:O(V + E)

题型四:数据流——求中位数(双堆)

题目描述

设计数据结构,支持持续 addNum,随时返回当前所有数的中位数。

解题思路

与 Snowflake 业务最接近的就是数据流题。用双堆:大顶堆存较小一半,小顶堆存较大一半,保持两堆大小平衡。

Python 解法

import heapq

class MedianFinder:
    def __init__(self):
        self.lo = []  # 大顶堆(存负值),较小一半
        self.hi = []  # 小顶堆,较大一半

    def add_num(self, num):
        heapq.heappush(self.lo, -num)
        heapq.heappush(self.hi, -heapq.heappop(self.lo))
        if len(self.hi) > len(self.lo):       # 保持 lo 不少于 hi
            heapq.heappush(self.lo, -heapq.heappop(self.hi))

    def find_median(self):
        if len(self.lo) > len(self.hi):
            return -self.lo[0]
        return (-self.lo[0] + self.hi[0]) / 2

面试官追问:如果数据流无法全部放进内存怎么办?优秀回答会谈到外部排序、分桶统计,甚至 t-digest 等近似算法。

时间复杂度:add O(log n)、查询 O(1) 空间复杂度:O(n)

备考策略

能力 重点 推荐 LeetCode
双指针 / 前缀和 单向收缩证明 11, 42, 560
滑动窗口 边界维护 76, 3, 438
图搜索 / 拓扑 环检测 207, 210, 200
堆 / 数据流 双堆平衡 295, 215, 347

核心不在写出答案,而在清晰解释思路、保证健壮性、并展示数据规模扩展后的应对方案


FAQ

Q1:Snowflake 的 coding 题难吗?和 LeetCode 比是什么水平? 以 LeetCode 中等偏上为主,很少出冷门题。难点不在题目本身,而在面试官要求你立刻给最优解并解释为什么最优,暴力解通过测试也拿不到高分。

Q2:Snowflake 面试用什么平台?时长多久? VO 阶段多用 CoderPad 或自带 IDE,单轮约 45 分钟,通常 1-2 题。重点是边写边讲清思路与复杂度。

Q3:Snowflake 最常考哪些题型? 数组(双指针/前缀和)、字符串(滑动窗口)、图(DFS/BFS/拓扑排序)、堆与数据流(中位数/Top-K)四大模块覆盖了绝大多数高频题。

Q4:数据流题被追问"内存放不下"怎么答? 谈外部排序、分桶处理与近似算法(如 t-digest 估中位数、Count-Min Sketch 估频率),并说明精度与内存的取舍,这正是 Snowflake 想看的工程深度。

Q5:如何高效准备 Snowflake coding 面试? 以 LeetCode 高频中等题为基础,重点练滑动窗口、单调栈、图搜索、堆四类,并刻意训练"边写边解释为什么最优"的表达。


正在准备 Snowflake 面试?

如果你能写出答案但讲不清"为什么最优",或想在 VO 阶段有人帮你做题型拆解与表达陪练,可以聊聊完整的 OA辅助 / VO辅助 方案——从最优解推导到复杂度论证,全程支援。


联系方式

需要面试真题与定制备战计划?立刻联系微信 Coding0201获取真题

Email: [email protected] Telegram: @OAVOProxy