← 返回部落格列表 Meta University 實習 VO 真題復盤:字串子序列計數 + 原地找重複 + 實習節奏
Meta

Meta University 實習 VO 真題復盤:字串子序列計數 + 原地找重複 + 實習節奏

2026-06-03

Meta 的實習 VO 題目不偏怪,但幾乎每道題都有一個 Follow-up,逼你把暴力解最佳化到最優、或在限制條件下重寫。這篇復盤兩道真實風格的 VO 題——一道字串子序列計數,一道原地找重複——再附上 Meta 實習的 12 週時間線,讓你知道哪幾週才真正決定 return offer。

VO 1:統計 words 中是 s 子序列的個數

給一個主串 s 和一個字串陣列 words,統計 words 裡有多少個是 s 的子序列。

範例:s = "abc", words = ["a", "bb", "acd", "ace"] → 輸出 2("a" 和 "ace" 是子序列)

基礎解法:雙指標

對每個 word 用雙指標掃一遍:當前字元匹配則兩個指標都走,否則只走主串指標。word 指標走到底說明它是子序列。

def is_subsequence(word, s):
    i = 0  # word 指標
    for ch in s:
        if i < len(word) and word[i] == ch:
            i += 1
    return i == len(word)

def count_subsequences(s, words):
    return sum(is_subsequence(w, s) for w in words)

複雜度:O(m · n),m = 所有 word 總長,n = len(s)。

Follow-up:words 很多、s 很長,如何最佳化?

最佳化思路:預處理主串 s,建一個 charIndex——記錄每個字元在 s 中出現的所有位置(升序)。對每個 word 的字元,用二分查找在「上一個匹配位置之後」快速定位下一個出現點。

from bisect import bisect_right
from collections import defaultdict

def build_index(s):
    idx = defaultdict(list)
    for i, ch in enumerate(s):
        idx[ch].append(i)
    return idx

def is_subseq_fast(word, idx):
    prev = -1  # 上一個匹配到的位置
    for ch in word:
        positions = idx.get(ch)
        if not positions:
            return False
        # 找第一個 > prev 的位置
        j = bisect_right(positions, prev)
        if j == len(positions):
            return False
        prev = positions[j]
    return True

def count_subsequences_fast(s, words):
    idx = build_index(s)
    return sum(is_subseq_fast(w, idx) for w in words)

複雜度:預處理 O(n),每個 word 用二分 O(k · log n),k = word 平均長度。總計 O(n + m · k · log n)——當 words 很多時遠優於暴力。

口述要點:先講雙指標 baseline,再說「主串固定、要查很多次 → 預處理 + 二分」這個最佳化動機,面試官最看重這個推導過程。

VO 2:原地找陣列中所有重複元素

長度為 n 的陣列 array,每個元素 x 滿足 0 ≤ x ≤ n-1。找出陣列中所有重複的元素。

範例:input = [3, 1, 2, 3, 0] → output = [3] Follow-up:不用額外空間、不用遞迴或函數呼叫。

核心思路:原地交換歸位

每個元素 x 應該待在下標 x 的位置。遍歷陣列,把當前元素交換到它該在的位置;如果目標位置已經是正確的值,說明遇到了重複。

def find_duplicates(array):
    n = len(array)
    res = []
    i = 0
    while i < n:
        x = array[i]
        # x 應該待在下標 x
        if array[i] != i:
            if array[array[i]] == array[i]:
                # 目標位置已是正確值 → 重複
                if array[i] not in res:
                    res.append(array[i])
                i += 1
            else:
                # 交換歸位
                array[array[i]], array[i] = array[i], array[array[i]]
        else:
            i += 1
    return res

複雜度:時間 O(n),空間 O(1)。 關鍵:每次交換都把一個元素放到正確位置,所以總交換次數是 O(n)——while 迴圈不會退化成 O(n²)。

Follow-up 滿足點:沒用額外空間(原地交換)、沒用遞迴、沒用額外函數呼叫——完全符合限制。

Meta 實習時間線:哪幾週決定 return offer

很多人不知道,Meta 實習的評估其實只看前 10 週。以 12 週實習為例:

週次 階段 說明
Week 1-3 Onboarding(入職) 熟悉環境、配 mentor、上手第一個任務
Week 5-6 Mid-cycle review 中期回饋,決定後半程方向
Week 10-11 Final 決策 return offer 在這裡定
Week 11-12 收尾放鬆 評估已結束,享受最後兩週

核心提醒:只有 Week 1-10 的表現 會計入實習考核。所以前期就要主動定義清楚專案 scope、和 mentor 高頻對齊、Week 5-6 的中期 review 一定要拿到明確回饋並據此調整。

備考建議

FAQ

Q1:Meta University 和普通實習 VO 區別大嗎? 題型接近,都是「Medium + Follow-up」。Meta University 更偏基礎資料結構 + 雙指標 / 陣列操作。

Q2:VO 幾輪? 實習通常 1~2 輪 coding VO(每輪 2 題),外加 behavioral。

Q3:可以用 Python 嗎? 可以。Meta 不限語言,Python 寫雙指標 / 原地交換很簡潔,適合講思路。

Q4:前期表現一般,後面還能翻盤嗎? 能,但要趁早。Week 5-6 的 mid-cycle review 是關鍵糾偏點,拿到回饋後立刻調整還來得及。


正在準備 Meta 實習 VO?

如果你 baseline 能寫但 Follow-up 卡殼、原地操作不熟、或想要面試日真人同步陪跑做即時 cue,可以聊聊看完整方案:高頻題型精講 + 限時 mock + 全程即時輔助 + 逐題複盤。


聯絡方式

需要面試真題與客製化備戰計畫?立刻聯絡微信 Coding0201獲取真題

Email: [email protected] Telegram: @OAVOProxy