← 返回博客列表 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