← 返回部落格列表 Meta SDE NG VO 真題:歸併排序變體 + 滑動視窗最大值
Meta

Meta SDE NG VO 真題:歸併排序變體 + 滑動視窗最大值

2026-06-15

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 閘道」的邏輯:

  1. 進來時把 charord() 統一轉成 int
  2. 複用原封不動的 merge sort 核心;
  3. 出去時再用 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)。

於是需求很明確,要一個資料結構能做到:

  1. 只保留「後面還可能成為最大值」的元素,並保持有序;
  2. 佇列首 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)。

四、臨場提醒


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 真題與陪練

聯絡方式