题目重点:可读 OA 给出四层完整内存云存储接口;以文件所有权和容量不变量处理 Top N、merge、独立备份及恢复冲突。
题意与假设
这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。
- 文件名全局唯一,文件记录为 name→(size,owner),用户记录为 userId→(capacity,used);admin 容量无限且 Level 1 addFile 归 admin。
- 容量和文件大小用非负整数;题目没有负值约束、admin merge 规则与 mergeUser ‘cannot be merged’ 的全部原因,训练版禁止 self-merge/admin-merge。
- backup 为当时该用户文件的 name→size 独立拷贝;merge 后删除被合并用户及其备份,保留目标用户原备份。
- restore 不改变容量上限,但要据实际恢复的文件重新计算 used;若备份大小超过当前容量如何处理题目未明,训练版按题面‘restore 不影响 storage capacity’允许恢复并标记剩余空间不足,需现场确认。
解题路线
- Level 1 用全局 files map 实现增/查/删,并统一封装 owner used 更新,避免 Level 1/admin 和 Level 3 两套路径出现容量账不一致。
- Level 2 过滤前缀,再按 (-size,name) 排序取 n;若 n≤0 返回空。题目说输出格式为 () 但内容丢失,接口适配层需等真实测试确认。
- Level 3 addUser 校唯一;addFileBy 先检查用户、文件名和 remaining≥size,再一次性写文件与 used;mergeUser 先校两个用户,再遍历被合并 owner 的文件改成目标,capacity/used 逐项相加并删除源用户/源备份。
- Level 4 backupUser 深拷贝当前 owner 文件的 (name,size);restoreUser 先删本用户当前所有文件,若无备份返回已恢复 0,否则逐个恢复不存在于全局 files 的快照文件,碰到其他用户占有同名文件即跳过。
- 每次操作后检查不变量:文件名唯一;非 admin 文件 owner 存在;user.used 等于其实际文件 size 和;backup 修改后仍独立。
手动走一遍
训练例:U 拥有 a(3)、b(2) 并备份;U 删除 a,V 随后创建同名 a(4)。restore(U) 先删 U 现有 b,再试备份:a 因 V 已占用跳过,b 恢复,返回 1,U.used=2;容量上限未改。若 U 后来合并 V,V 的备份删除,U 原备份不变。
规模与取舍
文件 map 增查删均摊 O(1);getNLargest 扫 F 文件并排序 M 个匹配项 O(F+M log M),可用堆改善只取小 n 的排序成本;merge/backup/restore 扫相关文件 O(F) 基线,备份空间 O(累计备份文件数)。
易错点与追问
容易失分的边界
- 备份只保存文件名而忘大小,或保存指向活文件 map 的引用。
- restore 时不删现有 owner 文件,导致不再是快照状态。
- 同名文件由其他用户占用时强行覆盖。
- merge 后丢目标用户备份或留下被合并用户备份。
- restore 后 used 与实际 files 不一致。
- 猜测抓取丢失的 getNLargest 精确格式。
继续深挖
- restore 快照总大小超过容量怎样定义?
- 大用户 merge 如何避免 O(F) 阻塞?
- Top N 查询频繁时如何维护索引?
- 备份是否应做多版本及增量?
