← 返回博客列表 Citadel SDE Intern OA 全解析:Price Check + Framing Text + 好友推荐三题拆解
Citadel

Citadel SDE Intern OA 全解析:Price Check + Framing Text + 好友推荐三题拆解

2026-06-04

在竞争激烈的量化金融领域,Citadel 作为行业先锋,一直吸引着大量优秀学生。对想拿 Software Development Engineer(SDE)实习的同学来说,Citadel SDE Intern OA 是通往梦校实习岗位路上的关键门槛。本文把这套 OA 最常见的三道题完整拆开讲:题意、思路、复杂度、容易翻车的边界。

一、Citadel Intern OA 概览

维度 详情
平台 HackerRank
题量 通常 3 道编程题
风格 模拟 + 字符串 + 图,重细节、重鲁棒性
难度 单题不算难,但条件多、易因理解偏差挂分

Citadel OA 的核心不是「会不会最优解」,而是「你写的代码够不够稳、边界处理得干不干净」。

二、题 1:Price Check(价格核对)

一家商店用老式收银机,价格靠人工录入,偶尔出错。给定商品列表及其正确价格,以及实际售出记录和录入价格,统计售价录入错误的次数

def priceCheck(products, productPrices, productSold, soldPrice):
    # 建立 商品名 -> 正确价格 的映射
    correct = dict(zip(products, productPrices))
    errors = 0
    for name, paid in zip(productSold, soldPrice):
        # 浮点比较留容差,避免 2.89 != 2.8900001 的精度坑
        if abs(correct[name] - paid) > 1e-9:
            errors += 1
    return errors

复杂度:时间 O(n + m),空间 O(n)。 边界陷阱:价格是浮点数,千万别用 == 直接比,要留 1e-9 容差;售出商品一定在商品表里,但仍建议用 dict 而非线性查找,避免 O(n·m)。

三、题 2:Framing Text(文字加框)

给一个含多个单词的字符串,把每个单词单独占一行,整体用矩形框包起来,单词两侧各留一个空格。

例如 "Hello World in a frame"

+-------+
| Hello |
| World |
| in    |
| a     |
| frame |
+-------+
def print_boxed_text(input_str):
    words = input_str.split()
    width = max(len(w) for w in words)          # 最长单词决定框宽
    border = '+' + '-' * (width + 2) + '+'
    lines = [border]
    for w in words:
        # 左对齐补到统一宽度,两侧各一个空格
        lines.append('| ' + w.ljust(width) + ' |')
    lines.append(border)
    return '\n'.join(lines)

复杂度:时间 O(总字符数),空间 O(同)。 边界陷阱:框宽由最长单词决定,短单词要 ljust 左对齐补空格;顶部和底部边框的 - 数量是 width + 2(含两侧空格),少算一个就对不齐。

四、题 3:Recommendation System(好友推荐)

社交应用的好友推荐原型:n 个用户(0..n-1),m 条好友关系。给用户 y 推荐用户 x 的条件是:x、y 还不是好友,且二者共同好友数最多。平局取索引最小者;没有候选则输出 -1。

from collections import defaultdict

def recommend(n, friendships):
    adj = defaultdict(set)
    for a, b in friendships:
        adj[a].add(b)
        adj[b].add(a)

    result = []
    for y in range(n):
        best_user, best_mutual = -1, 0
        for x in range(n):
            if x == y or x in adj[y]:
                continue                     # 跳过自己和已是好友的
            mutual = len(adj[x] & adj[y])    # 共同好友数 = 邻接集合交集大小
            # 共同好友更多则更新;平局因 x 递增遍历,自动取最小索引
            if mutual > best_mutual:
                best_mutual = mutual
                best_user = x
        result.append(best_user if best_mutual > 0 else -1)
    return result

复杂度:朴素 O(n²·d)(d 为平均度数)。 边界陷阱:平局取最小索引——只要 x 从小到大遍历、用严格 > 更新即可自动满足;共同好友数为 0 时要输出 -1,别误推一个毫无关联的用户。

五、备战节奏

重点 建议
模拟题 把题意条件逐条列清单,写完对照核验
字符串格式题 注意对齐、边框宽度,本地多跑几组用例
图论题 邻接表/集合交集是高频,练熟共同好友、连通分量
时间控制 单题别死磕,先 AC 再优化

FAQ

Q1:Citadel Intern OA 难度高吗?

单题难度中等,但条件细、容错低。挂分的人多半不是不会算法,而是漏了一个边界条件或浮点比较用了 ==。稳比快更重要。

Q2:浮点价格比较为什么不能用 ==?

录入和存储可能有微小精度误差,2.89 在浮点里未必精确相等。用 abs(a-b) > 1e-9 判断更稳,这是 Price Check 最常见的翻车点。

Q3:好友推荐题一定要最优解吗?

不一定。n 不大时 O(n²) 集合交集就能过。重点是平局取最小索引、无候选输出 -1 这两个规则别写错。

Q4:OA 时间紧张写不完怎么办?

三题按熟悉度排序,先把有把握的 AC,留细节充裕的题最后做。我们提供 OA 辅助 / OA 代写:题型预测 + 限时陪练 + 实时给思路,帮你把会的稳稳拿下。


正在准备 Citadel SDE Intern OA?

这套 OA 考的是细节和鲁棒性,不是偏题怪题。如果你想要三题的限时陪练、量化金融公司 OA 的题型预测,或需要 OA 辅助 / OA 代写 的实时对接,欢迎联系交流,发岗位 JD 先做题型拆解,再排练习计划。

立即添加微信 Coding0201获取 Citadel OA 真题与陪练

联系方式