‹ 全部面经
Meta SDE 面经:机架分配 + 餐厅座位管理 + 洗牌算法 + Kafka BQ 深挖
Meta SDE 四轮复盘:GenAI 开发经历追问、机架分配(有序结构 ceiling 查找)、餐厅座位管理(按桌型索引 + FIFO 队列)、Kafka 热点 BQ、洗牌算法,附 Coding 与系统设计准备重点。
VO
第一轮:印度裔面试官
先问了 GenAI 辅助开发的经历,重点追问:
- AI 生成代码的风险
- 幂等性
- 重复重试
- 测试保障
之后做机架分配系统设计:把服务器分配到满足功率要求、且剩余容量最小的机架上。
我先讲了 O(R) 遍历,再用 TreeMap 的 ceilingKey 优化到 O(log R)。
from bisect import bisect_left, insort
class RackAllocator:
"""racks 按 (剩余容量, rack_id) 有序存储,等价于 Java 的 TreeMap / TreeSet"""
def __init__(self, capacities):
self.racks = sorted((cap, rid) for rid, cap in enumerate(capacities))
def allocate(self, power):
i = bisect_left(self.racks, (power, -1)) # 第一个剩余容量 >= power 的机架
if i == len(self.racks):
return -1
cap, rid = self.racks.pop(i)
insort(self.racks, (cap - power, rid))
return rid
Python 的 list 插入是 O(R),生产中可以用
sortedcontainers.SortedList或平衡树,查找和更新都是 O(log R)。
第二轮:白人面试官 —— 餐厅座位管理
- 用 TreeMap 按座位数索引空桌,快速找到「能坐下且最小」的空桌。
- 满座时,客人进入 FIFO 队列;有桌子释放后,从队头重新尝试分配。
追问:队头是 8 人,但现在只释放了一张 4 人桌,怎么办?
回答:FIFO 不能跳队,只能等大桌。整桌分配,不拆座;碎片化问题不考虑。
from bisect import bisect_left, insort
from collections import deque
class Restaurant:
def __init__(self, tables): # tables: {table_id: 座位数}
self.size = dict(tables)
self.free = sorted((s, tid) for tid, s in tables.items())
self.queue = deque() # (party_id, 人数)
def _take_table(self, people):
i = bisect_left(self.free, (people, -1)) # 能坐下的最小桌
return self.free.pop(i)[1] if i < len(self.free) else None
def arrive(self, party_id, people):
table = None if self.queue else self._take_table(people) # 有人排队就不能插队
if table is None:
self.queue.append((party_id, people))
return table
def release(self, table_id):
"""返回这次被安排入座的 [(party_id, table_id)]"""
insort(self.free, (self.size[table_id], table_id))
seated = []
while self.queue:
party_id, people = self.queue[0]
table = self._take_table(people)
if table is None:
break # 队头坐不下,后面的人也不能跳队
self.queue.popleft()
seated.append((party_id, table))
return seated
第三轮:ABC 面试官 —— BQ 深挖
- 讲了 Kafka 热点问题:给 key 加随机后缀打散,调大
max.poll.records并拉长 poll 间隔。 - 负面反馈:直接坦白自己的大 PR 被吐槽,后来的改进:
- 拆成小 PR
- 上 Feature Flag
- 用标准化模板
第四轮:华人面试官
先问领导力 BQ。
Coding:洗牌算法
- 按轮次构建歌单,每轮用 HashSet 去重,保证同一轮内不重复。
- 再检查相邻两轮的首尾不同。
- 复杂度 O(N + M)。
- 高频歌靠轮次摊平;如果最后只剩它一首,也没办法避免连续。
最后聊了技术栈和 Oncall。
Coding 准备重点
重点关注树、链表、图。几道有代表性的题:
- 有效数字:处理负号、小数点、科学计数法的边界。
- 二叉树节点值为子节点平均值:递归遍历。
- 频率最高的 K 个数字:哈希表统计 + 最小堆维护 Top K。
- 区间覆盖最多的整数:排序后线性扫描。
系统设计:值得准备的题
设计 LeetCode 实时排行榜,需要考虑:
- 分数更新时排名怎么同步
- 存储
- 运行测试用例
- 消息队列的顺序和容错
- 重试
- 死信队列
- 幂等处理
几个小建议
- 沟通聚焦题目本身,不用刻意闲聊。
- 不要急着写代码,先理解每行代码的作用。Follow-up 可能会问到,后面也可能让你跑测试验证。
Meta 目前对 NG 的需求稳定,更新后的流程更偏基础,只要扎实准备,通过率并不低。不用被大厂名气吓到,一步一步来,希望大家都能有好结果!