做完 Coinbase OA 想说一句:如果你刷到过 CodeSignal 那道内存数据库四级题,这场基本就是默写。
题目是一道经典的 Memory Database四级递进题。Level 1 到 Level 4 会逐步增加需求,每完成一级测试通过后才能进入下一阶段,总时间 90 分钟。这类题其实在 CodeSignal 里出现频率挺高,除了 Coinbase,之前也见过 Persona、Meta、ZipRecruiter 等公司的 OA。题目背景可能换一下,但核心设计思路基本类似。

Level 1:基础增删查

两层字典 key -> {field -> value},set、get、delete 三个操作,嵌套 dict 全是 O(1)。
唯一要注意的是 delete 的返回值——删成功返回 True,key 或 field 不存在返回 False。得分清楚,别直接 pop 把返回值吞了。
Level 2:前缀扫描

加两个接口:scan 返回一条记录的所有 field,scan_by_prefix 只返回以某前缀开头的。格式都是 “field(value)”,按字典序排。
这级有个坑:返回的是拼好的字符串,不是元组也不是字典。CodeSignal 按字符串精确判题,括号少一个、格式错一点,整个 case 就挂。数据量不大,直接排序就行,不用优化。
Level 3:TTL

从这级开始,每个操作都多了个带 timestamp 的版本,还多了个 set_at_with_ttl。TTL 就是给值加个保质期,有效区间是 [timestamp, timestamp+ttl),左闭右开——到 timestamp+ttl 那一刻,它已经算过期了,这个边界别搞错。
我一开始的思路是”到点了就把它删掉”,写着写着发现不对——Level 4 要做时间回溯,你要是提前把值删了,回溯的时候啥都查不到了。
正确的做法是不删,给每个值存下它的生效区间,查询的时候拿当前 timestamp 去比。Level 1 那个 field -> value 就升级成 field -> (value, start, expire)。get_at 判断 start <= ts < expire 成立才返回,scan 那几个也是只留当前有效的。
Level 4:备份恢复

两个接口,backup 存快照,restore 恢复。这级其实卡点就一个:剩余 TTL 怎么顺延。
数据库的时间是只往前走的,restore 不会把时钟拨回过去。它做的事是——把快照里”这个值还能活多久”接到 restore 发生的这一刻,重新开始倒计时。所以 backup 存的不是绝对的过期时间,是剩余 TTL;restore 之后新的过期时间,就是 restore 的 timestamp 加上当初备份时的剩余 TTL。
举个具体的:一个值在 t=1、ttl=10 写进去,有效期 [1, 11)。t=5 做 backup 的时候,它已经活了 4 个单位,还剩 6。等 t=10 执行 restore,它的过期时间就重新算成 10+6=16,有效期变 [10, 16)。
这也是为什么 backup 必须存相对量。你要是存了绝对过期时间 11,restore 的时候根本没法顺延,直接就错了。
一句话通关
Level 1、2 别图快把结构写死。Level 1 就把值设计成 (value, start, expire),后面 Level 3、4 就是顺着加功能,不用重构。Level 4 看着吓人,记住“存剩余 TTL、restore 时按新 timestamp 顺延”就通了。时间上前两级快点过,大头留给 Level 3 和 4。
说下准备
这类 CodeSignal 四级题规律性强到离谱——题目从平台公共题库抽,背景来回就内存数据库、云存储文件系统、银行账户那几个,提前刷过就是默写加微调。Coinbase、Persona、Meta、ZipRecruiter 这些是共用一套题库的。
InterviewShow长期跟这个平台的真题更新,整理了 90 分钟 OOD 和 70 分钟四题两类共 130+ 道真题和验证过的代码,主流考点基本都覆盖了。准备这类 OA 的可以对着题库提前练手感,想按目标公司定向准备的也可以来聊。
祝大家都一把过~