SWE · CodeSignal OA Levels 1–4

Coinbase Cloud Storage OA:用户配额、容量缩减与压缩文件

file storage 题族从 add/copy 到 owner/quota,另帖给修改容量时按文件大小删除与 compress/decompress 变体。

题目重点:file storage 题族从 add/copy 到 owner/quota,另帖给修改容量时按文件大小删除与 compress/decompress 变体。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版 filename 全局唯一,file=(owner,size,compressedFlag),size 为正整数;copy 继承源 owner 或计入目标 owner 的具体规则题目未明确,训练版仅讨论两种需确认的口径。
  • 用户容量以文件 size 总和计;update_capacity(newCap) 若已用超过容量,按 size 降序删除直到 used≤newCap,同 size 训练版按 name 字典序,实际以题面为准。
  • 压缩仅允许普通文件变成 name+'.compressed'、size 新值 floor(size/2),解压反向并将 size×2;奇数 size 恢复不一定等于原值,真实题面需明确舍入或存 originalSize。

解题路线

  1. 维护 name→File 与 user→set(names)、user→usedBytes/capacity;所有 add/copy/remove 在单一 mutation 层同时更新两索引和 usedBytes。
  2. add/copy 先验证源/目标名与 quota,再原子提交;copy 的 owner 归属不明时在读题阶段确认,不能边写边猜。
  3. update_capacity 先写新 cap,若 used 超出,收集该用户文件按 (-size,name) 排序,逐个删除并扣 used,返回删除数/列表按具体接口。相同 size 的稳定顺序决定可复现结果。
  4. compress 先验证目标 `.compressed` 未占用,再算新 size 与 quota,原子地移除旧名和加入新名;decompress 先检查名字后缀和目标冲突,空间膨胀可能超额,不能先删除旧文件后才发现失败。
  5. 测试 user 不存在、重复名、copy 越 quota、capacity 变小多文件并列、压缩奇数大小、压缩后改容量、解压超额和目标名已存在。

手动走一遍

训练例用户容量 20,文件 a=9、b=7、c=4 已用 20;更新容量到 10,先删 a=9 后已用 11,继续删 b=7 后已用 4,保留 c。若仅删一个最大文件就返回,会仍超额。另一例 x=5 压缩成 2 再解压×2 为 4,说明奇数尺寸规则需核。

规模与取舍

文件表查找平均 O(1);单用户有 F 个文件时 update_capacity 排序 O(F log F)、删除 O(F),额外 O(F);压缩/解压平均 O(1) 哈希更新。所有用户文件与反向索引总体 O(N)。

易错点与追问

容易失分的边界

  • 只更新 file map,忘记 user usedBytes/owner 索引。
  • 更新容量删最大文件一次后不重检是否仍超额。
  • 压缩/解压先改旧文件再检查新文件名冲突。
  • 以为 size÷2 后×2 一定恢复原奇数值。
  • 将外链中的未知 Level4 细节当成题目已公开。

继续深挖

  • 奇数大小压缩如何保证可逆?
  • 用户文件量巨大时容量缩减怎样避免每次全排序?
  • copy file 的 owner 和 quota 应归谁?
  • 并发 add/copy/resize 如何保证 usedBytes 不超额?
✓已复制微信号!