← 返回博客列表 Citadel New Grad 三轮 VO 复盘:排列等式 / DMV 任务分配负载均衡 / 字符版拓扑排序
Citadel

Citadel New Grad 三轮 VO 复盘:排列等式 / DMV 任务分配负载均衡 / 字符版拓扑排序

2026-06-06

网上 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 真题与陪练

联系方式