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