Meta 的 SDE New Grad VO 不只考你會不會寫演算法,更看你怎麼讀題、怎麼拆題。這篇按 oavoservice 學員的一場 Meta SDE NG VO 複盤,挑兩道真題講清思路:第一題是歸併排序的「非典型變體」,第二題是經典的滑動視窗最大值(LeetCode 239)。兩題放一起,正好涵蓋「包裝既有邏輯」和「換資料結構做最佳化」兩類最常見的 follow-up 套路。文末附 VO輔助 / VO代面 的對接路徑,給正在大廠求職、刷題備考的同學一個實戰參考。
一、Meta SDE NG VO 概覽
| 維度 | 詳情 |
|---|---|
| 形式 | 遠端視訊面試(Coderpad / 共享編輯器) |
| 時長 | 單輪約 45 分鐘,2 道程式題 |
| 語言 | 自選,多數人用 Python |
| 考察 | 讀題拆題、邊界處理、複雜度最佳化、溝通表達 |
| 風格 | 題面可能「非典型」,重點看你能否抓住真正的考點 |
Meta NG 的程式輪節奏快,一輪經常要在 45 分鐘內吃掉兩道題。面試官給的題面不一定是 LeetCode 原題,反而常常故意包裝一下,看你能不能剝開外殼、定位到真正要考的核心邏輯。
二、題一:歸併排序的非典型變體(輸入輸出包裝)
題目
先給一個非常簡單的題:給定一個 list,純排序,用 Python 實作。面試官明確要求寫 merge sort(歸併排序)。
寫完之後是 follow-up:這個 list 裡不只有 int,還會混入 char(字元),要求一併排好序。
拆題:他到底想考什麼?
這不是一個典型演算法題。遇到這種被刻意包裝過的題,腦子裡第一件事應該是——他想考的到底是什麼?
對這道題來說,考點很清楚:在不改動既有核心演算法的前提下,如何做合適的輸入 / 輸出處理。說人話,就是要你做一層類似「API 閘道」的邏輯:
- 進來時把
char用ord()統一轉成int; - 複用原封不動的 merge sort 核心;
- 出去時再用
chr()把當初是字元的元素轉回去。
抓住這個重點,實作本身沒有奇技淫巧。關鍵是把「包裝輸入輸出」的邏輯抽成單獨的函式,讓 merge sort 主體保持乾淨、邏輯清晰。
Python 解法
先是不動的歸併排序核心:
def merge_sort(arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left = merge_sort(arr[:mid])
right = merge_sort(arr[mid:])
return _merge(left, right)
def _merge(left, right):
merged = []
i = j = 0
while i < len(left) and j < len(right):
if left[i] <= right[j]:
merged.append(left[i]); i += 1
else:
merged.append(right[j]); j += 1
merged.extend(left[i:])
merged.extend(right[j:])
return merged
再把輸入輸出包裝抽成一個獨立函式,merge sort 完全不用改:
def sort_mixed(items):
# 1) 包裝輸入:記下哪些位置原本是 char,統一轉成 int 的可比較鍵
encoded = []
is_char = []
for x in items:
if isinstance(x, str):
encoded.append(ord(x))
is_char.append(True)
else:
encoded.append(x)
is_char.append(False)
# 2) 複用核心:但要讓排序後還能知道某個值原本是不是 char
# 所以排的是 (值, 原本是否為 char) 的二元組
pairs = list(zip(encoded, is_char))
pairs = merge_sort(pairs) # 元組按第一維比較,天然可用
# 3) 包裝輸出:原本是 char 的,用 chr 轉回去
return [chr(v) if was_char else v for v, was_char in pairs]
要點:把 (值, 是否為char) 打包成元組送進 merge sort,元組天然按第一維比較,核心邏輯零改動;解碼時只看第二維決定要不要 chr() 還原。
print(sort_mixed([3, 'a', 1, 'Z', 2]))
# [1, 2, 3, 'Z', 'a'] ord('Z')=90 < ord('a')=97
時間複雜度:O(n log n)(歸併排序主導)。空間複雜度:O(n)(編碼陣列 + 歸併暫存陣列)。
三、題二:滑動視窗最大值(單調佇列)
題目
LeetCode 239。給整數陣列 nums 和視窗大小 k,視窗從陣列左側每次向右滑動一格,回傳每個視窗內的最大值組成的陣列。
拆題:最佳化點只有一個
最直觀的做法是每個視窗都求一次最大值,時間複雜度 O(nk)。做最佳化的關鍵永遠在思路:這題真正能最佳化的點只有把那個 k 幹掉——也就是把「視窗內求最大值」從 O(k) 降到 O(1)。
於是需求很明確,要一個資料結構能做到:
- 只保留「後面還可能成為最大值」的元素,並保持有序;
- 從佇列首 O(1) 取最大值,從佇列尾 O(1) 插入新元素 / 彈出更小的元素。
能同時滿足這兩點的,就是用 deque 實作的單調佇列(單調遞減佇列)。
Python 解法
佇列裡存索引,對應的值從佇列首到佇列尾單調遞減:
from collections import deque
def max_sliding_window(nums, k):
dq = deque() # 存索引,nums[dq] 單調遞減
res = []
for i, x in enumerate(nums):
# 佇列尾比目前小的都沒用了,彈掉(保證單調遞減)
while dq and nums[dq[-1]] <= x:
dq.pop()
dq.append(i)
# 佇列首滑出視窗了就彈掉
if dq[0] <= i - k:
dq.popleft()
# 視窗成形後,佇列首就是目前視窗最大值
if i >= k - 1:
res.append(nums[dq[0]])
return res
三個細節:佇列尾維護單調性(更小的元素永遠輪不到它當最大值,直接丟);佇列首檢查是否已滑出視窗;索引走到 k-1 後才開始記錄答案。
print(max_sliding_window([1, 3, -1, -3, 5, 3, 6, 7], 3))
# [3, 3, 5, 5, 6, 7]
時間複雜度:O(n)(每個索引最多進佇列、出佇列各一次)。空間複雜度:O(k)。
四、臨場提醒
- 遇到「非典型題」先別急著寫,先問自己考點是什麼,再決定包裝哪一層。
- 把輸入輸出處理抽成獨立函式,主演算法保持乾淨——面試官會注意到你的程式碼組織能力。
- 最佳化題先說清「唯一能最佳化的點在哪」,再引出資料結構,溝通比直接默寫更重要。
- Meta 一輪兩題、節奏緊,第一題簡單的話盡量快、留時間給 follow-up 和第二題。
FAQ
Q1:Meta SDE NG VO 一輪考幾道題?難度如何?
程式輪通常一輪約 45 分鐘、2 道題,難度集中在 LeetCode 中等,偶有中上。重點不在題難,而在讀題、拆題和溝通——題面常被刻意包裝,考你能不能定位真正的考點。
Q2:第一題這種「歸併排序裡混 char」算偏題嗎?怎麼準備?
不算偏題,它考的是「在不改核心演算法的前提下做輸入輸出包裝」的工程思維。準備時多練把通用演算法套到變形輸入上,習慣用 ord / chr、元組打包等手段做轉換,並把包裝邏輯抽成獨立函式。
Q3:滑動視窗最大值為什麼要用單調佇列?
因為唯一的最佳化點是把「視窗內求最大值」從 O(k) 降到 O(1)。單調佇列(deque 實作)能在佇列首 O(1) 拿最大值、佇列尾 O(1) 插入和彈出,整體把 O(nk) 降到 O(n),是這類問題的標準解法。
Q4:Meta VO 用什麼平台?可以用 Python 嗎?
多數輪次在 Coderpad 或共享編輯器裡進行,語言自選,絕大多數人用 Python。需要限時 mock、逐題講解或 VO輔助 / VO代面 全程對接,可以走下面的路徑客製。
正在準備 Meta SDE NG VO?
Meta NG 程式輪節奏快、題面愛包裝,吃的是「拆題 + 溝通 + 程式碼組織」。oavoservice 提供 Meta 全流程陪練:歸併排序變體 / 滑動視窗 / 單調佇列 / 雜湊等高頻題限時模擬,Coderpad 環境與拆題表達逐題講解,按 NG 崗題型做預測。教練含大廠資深工程師,支援 VO輔助 / VO代面 全程對接。
立即加入微信 Coding0201,取得 Meta 真題與陪練。
聯絡方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy