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