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