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 一定要拿到明確回饋並據此調整。
備考建議
- 每道題都準備 Follow-up:Meta 幾乎必追問最佳化或加限制,baseline 之後立刻能講最佳化方向。
- 原地操作要練熟:交換歸位、快慢指標、位元運算標記,這類 O(1) 空間技巧高頻出現。
- 邊寫邊講推導:面試官給的是「思路分」,不是「AC 分」——講清楚為什麼這樣最佳化比直接寫出最優解更重要。
- 溝通即評分:Meta 看重 communication,卡住時主動說出當前思路,往往能拿到提示。
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