← 返回部落格列表 Snowflake Onsite 複盤:LRU + Range Module 電面,滑動視窗眾數 + line sweep + 日誌攝取系統設計
Snowflake

Snowflake Onsite 複盤:LRU + Range Module 電面,滑動視窗眾數 + line sweep + 日誌攝取系統設計

2026-06-06

Snowflake 的面試很看重 工程實作的完整性和系統設計的 trade-off,尤其是 Infra 方向。整體流程是 兩輪 phone screen(純 coding)+ 四輪 Virtual Onsite(兩輪 coding + 一輪 BQ + 一輪 system design)。題目難度中等偏上,但面試官看得非常細,邊界處理和資料結構選型的理由是評分重點。下面完整複盤。

一、Snowflake 面試概覽

階段 輪次 內容
Phone screen 2 輪 × 1h 純 coding:LRU Cache / Range Module
Onsite 4 輪 2 輪 coding + 1 輪 BQ + 1 輪 system design
難度 中等偏上 邊界處理 + 資料結構選型理由是重點
風格 Infra 導向 system design 要落到具體實作

Phone Screen 兩題速記

二、Onsite 題 1:滑動視窗眾數

給定一個整數陣列和視窗大小 k,返回每個視窗中出現次數最多的元素。要求高效查詢,不能每次重新掃視窗。

思路轉化:HashMap 記頻次 + 懶刪除的最大堆。視窗滑動時更新頻次並把新頻次推入堆,堆頂若與當前真實頻次不符則懶刪除。

import heapq
from collections import defaultdict

def window_mode(nums, k):
    freq = defaultdict(int)
    heap = []                           # (-count, value)
    res = []
    for i, x in enumerate(nums):
        freq[x] += 1
        heapq.heappush(heap, (-freq[x], x))
        if i >= k - 1:
            # 懶刪除:堆頂頻次過期就丟棄
            while -heap[0][0] != freq[heap[0][1]]:
                heapq.heappop(heap)
            res.append(heap[0][1])
            # 移出視窗最左元素
            left = nums[i - k + 1]
            freq[left] -= 1
    return res

討論重點:面試官反覆問 如何高效處理已被移除的元素——懶刪除的核心是「堆裡存的頻次快照過期就跳過」。時間複雜度:O(n log n);空間複雜度:O(n)。

三、Onsite 題 2:帶頻次的區間合併(line sweep)

區間可能重疊多次,需要按出現頻次輸出合併後的區間及其頻次。

思路轉化line sweep。把每個區間拆成起點 (+1) 和終點 (-1) 事件,按時間排序後掃描,維護當前活躍區間數(頻次),頻次變化處即為分段邊界。

def merge_with_freq(intervals):
    events = []
    for s, e in intervals:
        events.append((s, 1))           # 進入:頻次 +1
        events.append((e, -1))          # 離開:頻次 -1
    events.sort()
    res = []
    active = 0
    prev = None
    for pos, delta in events:
        if prev is not None and pos > prev and active > 0:
            res.append((prev, pos, active))   # [prev, pos) 頻次 active
        active += delta
        prev = pos
    return res

討論重點:邊界處理——起點和終點是否同一時間點、區間是否 inclusive。把端點排序時讓 -1 與 +1 的順序定義清楚是關鍵。時間複雜度:O(n log n);空間複雜度:O(n)。

四、Onsite 系統設計:Log Ingestion Service

設計一個日誌攝取服務(簡化版),支援 high throughput ingest、durable storage,並支援查詢最近 N 條日誌。

架構思路(要落到具體實作,不能只講高層):

選型 作用
接入 Load Balancer 分攤寫入壓力
緩衝 Kafka / 自建 ring buffer 削峰、解耦 ingest 與儲存
儲存 S3(落盤)+ RocksDB(索引) 持久化 + 快速查詢
查詢 time-based index 加速「最近 N 條」

面試官追問的 trade-off:log 去重、亂序處理、consistency。整段對話偏 infra,考察對系統瓶頸的理解——比如寫入熱點、index 大小、查詢延遲之間的取捨。

五、BQ 輪速記

面試官問了不少專案處理類問題:

我講了一個非同步資料處理系統裡如何權衡 批次延遲 vs 資源使用率 的故事。面試官很在意你能否在模糊場景下做判斷。

六、備考建議


FAQ

Q1:Snowflake 面試一共幾輪?

兩輪 phone screen(純 coding)+ 四輪 onsite(兩輪 coding + 一輪 BQ + 一輪 system design)。整體偏 Infra 方向,看重工程實作完整性。

Q2:Snowflake 的 coding 難嗎?

中等偏上。題目本身(LRU、Range Module、滑動視窗、line sweep)不算最難,但面試官看得極細,懶刪除、TreeMap 複雜度、區間拆分等 corner case 會反覆追問。

Q3:Snowflake 的 system design 怎麼準備?

一定要落到具體實作,而不是只講高層結構。以 log ingestion 為例,要能展開 buffer(Kafka / ring buffer)、儲存(S3 + RocksDB)、索引(time-based)以及去重 / 亂序 / 一致性的 trade-off。

Q4:怎麼高效準備 Snowflake VO?

把高頻資料結構題練到能講清選型理由,system design 準備 infra 落地版本。如果想要這幾道真題的限時陪練、line sweep / 懶刪除堆專項,或需要 VO 輔助 / VO 代面 的即時對接,可以發職缺 JD 先做題型預測再排練習計畫。


正在準備 Snowflake Onsite?

Snowflake 考的是工程實作完整性 + Infra 系統設計 + 溝通 trade-off。oavoservice 提供 Snowflake / 資料基礎設施方向的 VO 全流程陪練:滑動視窗 / line sweep 限時模擬、log ingestion 系統設計推演、BQ trade-off 故事打磨,也支援 VO 輔助 / VO 代面 的即時對接。教練含前大廠 Infra 工程師,熟悉 Snowflake「摳實作細節」的評分風格。

立即新增微信 Coding0201獲取 Snowflake VO 真題與陪練

聯絡方式