网上 Citadel 的三轮 video interview 题目资源非常少,尤其是 new grad 版本。这篇详细记录整个流程,尤其是三轮 VO 的 coding 内容。Citadel 的题目不只是刷题那么简单,很多贴近实际工作中的 模型设计、系统模拟、贪心策略——而最关键的,是沟通能力。
一、Citadel New Grad 面试概览
| 维度 | 详情 |
|---|---|
| 入口 | 海投,免 OA 直进 screening |
| Screening | 45 分钟,轻松聊项目 + 1 道 backtracking |
| 正式 VO | 2 小时 15 分,三轮 back-to-back,中间无休息 |
| 每轮结构 | 简历 / BQ + 算法 coding(约 45 分钟) |
| 平台 | Citadel 专属 video + 编辑器一体平台 |
二、Screening:排列等式(回溯)
把数字 1 到 9 分别填入 ABC、DEF、GHI 三个三位数的位置,要求 ABC + DEF = GHI,不能重复数字,问总共有多少种有效组合。
思路转化:典型 backtracking 基础题。枚举 1-9 的所有排列,每 3 位划分成 ABC、DEF、GHI,判断是否满足等式。面试官说「有些人会卡在如何生成合法 permutation 上」。
from itertools import permutations
def count_valid():
count = 0
for p in permutations(range(1, 10)): # 9 个数字的全排列
abc = p[0] * 100 + p[1] * 10 + p[2]
de_f = p[3] * 100 + p[4] * 10 + p[5]
ghi = p[6] * 100 + p[7] * 10 + p[8]
if abc + de_f == ghi:
count += 1
return count
复盘:9! = 362880 种排列,暴力完全可接受。面试官最后一起跑了几个 sample 验证。时间复杂度:O(9!);空间复杂度:O(1)(不计排列生成)。
三、第一轮 VO:DMV 任务分配负载均衡
一个 DMV 办公室,每个员工有一个 multiplier 代表工作速度(multiplier=2 表示处理任务耗时翻倍)。每个任务有一个 base duration(multiplier=1 时的标准耗时)。员工只能串行做任务,任务不可拆分。自行决定如何分配任务,返回完成所有任务的最短总时间。
思路转化:典型 load balancing。把任务按耗时从大到小排序,用一个 最小堆 模拟每个员工当前的累积完成时间,贪心地把任务分配给当前最空闲的员工,分配时乘以该员工的 multiplier。
import heapq
def min_completion_time(base_durations, multipliers):
# 堆里存每个员工的「当前累积完成时间」,初始 0
heap = [(0.0, m) for m in multipliers]
heapq.heapify(heap)
# 大任务先分配,避免最后塞不下
for dur in sorted(base_durations, reverse=True):
finish, mult = heapq.heappop(heap)
finish += dur * mult # 该员工处理这个任务的实际耗时
heapq.heappush(heap, (finish, mult))
return max(finish for finish, _ in heap)
复盘:所有 I/O 也要自己写,实现比较冗长,但逻辑不难。面试官确认通过,并提到「这题有很多不同分配方式,只要逻辑合理就行」。时间复杂度:O(n log m)(n 任务,m 员工);空间复杂度:O(m)。
四、第二轮 VO:不熟的题 + 沟通卡壳(挂的主因)
这轮是挂的主要原因。题目是没刷过的原题,一上来有点懵。面试官全程冷漠、不给提示。我的思路其实可行——想用一种结构存储状态——但面试官坚持要我用另一种类型。我们在 representation 上纠结很久,最后硬着头皮迁就,结果类型转换搞晕,逻辑出 bug,没时间 debug。
最大教训:遇到不熟的题 + 沟通不畅 + 时间压力时,怎么让面试官跟上你的节奏、怎么在冲突中找到折中,可能比题本身更影响成败。事后复盘发现我原本的方法是能跑通的,纯粹是双方理解和代码风格差太多。
五、第三轮 VO:字符版拓扑排序
输入是多个字符对,代表有向边 A -> B,同时提供一个字符全集。要求输出一个满足所有顺序约束的合法字符顺序,可以有多个解,返回任意一个。
思路转化:变种 topological sort(类似 Alien Dictionary)。构建图 + 入度表,用 Kahn 算法(BFS + in-degree) 输出合法顺序。
from collections import deque, defaultdict
def find_order(pairs, all_chars):
graph = defaultdict(list)
indeg = {c: 0 for c in all_chars}
for a, b in pairs: # a -> b
graph[a].append(b)
indeg[b] += 1
q = deque(c for c in all_chars if indeg[c] == 0)
order = []
while q:
c = q.popleft()
order.append(c)
for nxt in graph[c]:
indeg[nxt] -= 1
if indeg[nxt] == 0:
q.append(nxt)
return order if len(order) == len(all_chars) else [] # 有环则无解
复盘:之前刷过类似题,写得比较顺。面试官一边输入样例一边验证,全部正确,还给了优化建议,交流体验很好。时间复杂度:O(V+E);空间复杂度:O(V+E)。
六、面后总结
| 轮次 | 结果 | 关键 |
|---|---|---|
| Screening | 顺利 | 项目随便聊 + 回溯基础题 |
| VO 第一轮 | 顺利 | 负载均衡,贪心 + 最小堆 |
| VO 第二轮 | 翻车 | 不熟的题 + 沟通卡壳 + 时间吃紧 |
| VO 第三轮 | 顺利 | 拓扑排序,交流体验好 |
三四天后收到 rejection。Citadel 流程快、技术含量高,沟通能力真的很关键,尤其面对不熟或复杂题目时。
FAQ
Q1:Citadel New Grad 一定要做 OA 吗?
不一定。这次是海投、没有内推,甚至没做 OA 就直接收到 screening 电话邀请——他们可能根据简历挑了一批人直接进 screening。
Q2:Citadel 三轮 VO 是什么节奏?
2 小时 15 分钟三轮 back-to-back,中间没有休息。每轮约 45 分钟,开头简历 / BQ,后半段算法 coding。在 Citadel 专属的 video + 编辑器一体平台进行,不是 HackerRank 或 CoderPad。
Q3:Citadel 的题难吗?考什么方向?
不只是刷题。很多贴近实际工作的模型设计、系统模拟、贪心策略,比如 DMV 任务分配负载均衡。也有偏标准的题如字符版拓扑排序、排列回溯。难点常在临场沟通而非算法本身。
Q4:怎么避免第二轮那种沟通翻车?
当面试官坚持某种 representation 时,先确认对方意图再动手,必要时主动说明你的方案能跑通并请求保留。练习时刻意模拟「冷漠面试官 + 不熟题」场景,训练在冲突中找折中。我们的 VO 辅助 / VO 代面 / 面试辅助 可以陪你专门演练这类高压沟通场景。
正在准备 Citadel New Grad VO?
Citadel 三轮连面强度高,贪心 / 模拟 / 拓扑题 + 临场沟通都是关键。如果你想要这三道真题的限时陪练、负载均衡 / 拓扑排序专项,或「冷漠面试官」场景的沟通训练,欢迎交流:发岗位 JD 先做题型预测,再排练习计划,也支持 VO 辅助 / VO 代面 / 面试辅助 的实时对接。
立即添加微信 Coding0201,获取 Citadel VO 真题与陪练。
联系方式
- 微信:Coding0201
- Email:[email protected]
- Telegram:@OAVOProxy