最近刚刷完 Anthropic 的 Online Assessment,在 CodeSignal 平台上进行,限时 90 分钟完成 4 个 Level。这次 Anthropic OA 有点难度,比传统算法题麻烦很多,其实就是让你写一个内存版云盘系统。整体考察 OOD + 工程实现能力,我花了差不多 70 分钟把 4 个 Level 全部通过了。

Anthropic OA Questions 独家真题分享
Level 1:基础文件存取
题目要求: 实现文件的基本操作:添加文件(add_file)、获取文件大小(get_file_size)、删除文件(delete_file)。如果文件名已存在则添加失败。
解题思路: 我直接用一个字典当仓库,key 是文件名,value 是文件大小。add_file 时先检查名字有没有重复,如果重复就返回 False;get_file_size 直接从字典里读,如果不存在返回 None;delete_file 把字典里的项删掉,顺便把大小返回,如果文件不存在返回 None。整个实现非常直白,核心就是字典的增删查操作。
我额外加了类型检查和异常处理,保证输入合法。代码量很少,但要注意返回值要严格按照题目要求(bool 或 int | None)。这一关主要是热身,考察基本数据结构使用和边界处理。写完很快,几乎没有卡点,算是给后面 Level 打基础。
Level 2:查询前缀下最大文件
题目要求: 新增 get_n_largest(prefix, n) 接口,返回以 prefix 开头的 n 个最大文件(格式:[“name (size)”, …]),按大小降序,相同大小按名字字典序排序。如果文件数量少于 n,就全部返回。
解题思路: 我遍历整个仓库,把文件名开头符合 prefix 的文件挑出来存到一个列表里。然后按“大小从大到小”排序,如果大小一样就按名字字母顺序排,最后截取前 n 个返回字符串格式。
排序时我用了 Python 的 sorted + lambda,key = lambda f: (-size, name)。字符串拼接要严格按照 “name (size)” 格式,不能多空格或少括号。注意字符串格式要严格匹配。排序部分比较常规,但要小心前缀匹配的边界情况(空前缀、空结果等),整体写完后调试了两三次就过了。
Level 3:多用户与存储空间限额
题目要求: 支持 add_user(user_id, capacity)、add_file_by(user_id, name, size)、merge_user(user_id_1, user_id_2)。每个用户有容量限制,合并时把第二个用户的文件和剩余容量转给第一个用户。
解题思路: 我给每个用户建了一个档案(字典),记录他们的总容量、已用空间和拥有的文件列表。add_file_by 时先检查会不会爆仓,再调用基础的 add_file。merge_user 时把 user2 的所有文件转移给 user1,同时把剩余容量也加上,最后把 user2 删掉。admin 用户有无限容量,不受限制。
我额外维护了一个全局文件到用户的映射,方便删除和冲突检查。合并时要注意容量累加和文件所有权转移,避免重复文件。容量检查和合并逻辑要小心。我花了最多时间在这里,确保合并后容量计算正确和文件不丢失,写完后单测跑了几遍才放心。
Level 4:用户文件备份与恢复
题目要求: 支持 backup_user(user_id) 和 restore_user(user_id)。备份当前用户文件状态,恢复时回到最新备份(如果没有备份就清空所有文件)。恢复时如果文件名冲突就跳过该文件。
解题思路: 相当于给用户做个“快照”。backup_user 时把当前文件列表深拷贝一份存起来;restore_user 时先把用户现在的文件全清空,再把备份里的文件逐个尝试添加(冲突就跳过),最后返回成功恢复的文件数量。注意恢复不影响用户容量。
我用了 copy.deepcopy 来备份,避免引用问题。恢复时遍历备份列表,调用 add_file_by 检查是否能添加,成功就计数。这一关是整个 OA 最难的部分,重点是深拷贝和冲突处理逻辑。我一开始忘记 deepcopy 踩了个坑,后来改了之后就稳了。整体代码量稍大但逻辑不复杂,写完很有成就感。
写在最后
最后想分享一下我的备战心得 Anthropic 的 OA 信息差还是挺大的,尤其是 Level 3 和 4 的状态管理和备份逻辑。如果时间紧张或者对 OOD 不太熟悉,可以考虑 Interview Aid 的 OA 辅助服务,他们在 CodeSignal 上经验丰富,能帮你快速理清思路,确保通过率。