
Ramp 的 OA 更像一次时间紧的产品实现题。开题后先把输入、输出和状态变化写在纸上,别急着把所有分支塞进一个函数。题目一旦碰到账单、报销或审批,最怕的不是算法卡住,而是重复事件、边界日期和规则优先级混在一起。
这轮练习把重点放在两道需要持续维护状态的题上。先做能快速跑通的主路径,再为每一个更新操作补一个反向或重复调用测试,提交前才有余量检查格式和复杂度。
第一题:多币种消费记录的月度限额
题目描述
给定一组公司卡消费记录,每条记录包含 employeeId、timestamp、amount、currency 和 transactionId。系统按员工和自然月统计美元消费额;同一 transactionId 只计一次。汇率表按日期生效,输入查询一个员工在某个月是否超过限额,并返回超过限额的第一笔消费。
解题思路
先按日期取汇率,把金额转换成最小货币单位,避免浮点误差。用 seenTransactionId 去重,再以 (employeeId, yearMonth) 为键维护累计金额。为了回答“第一笔”这一追问,消费记录要按时间排序;累计值第一次越过限额时,把该条记录保存在 firstExceeded。重复的交易 ID 必须在更新累计值前直接跳过。复杂度:排序后为 O(n log n),状态表占 O(n) 空间。
第二题:审批规则的覆盖与撤销
题目描述
实现费用审批规则引擎。规则按优先级匹配部门、金额区间和费用类别,动作包含 approve、review、reject。后添加的规则能覆盖同优先级的旧规则;调用 remove(ruleId) 后,系统要立即恢复下一条有效规则。给定多条报销申请,输出每一条的最终动作和命中的规则 ID。
解题思路
不要把“最后写入的规则”当成唯一状态。为每个匹配维度保存候选规则集合,并按 (priority, createdAt, ruleId) 排序;查询时从高优先级向下选第一条仍有效的规则。删除操作只标记失效,查询时跳过失效项,等堆顶出现失效记录再懒删除。金额区间要统一成闭区间或左闭右开区间,测试 minAmount、maxAmount 和恰好相等的金额。复杂度:单次查询取决于匹配规则数,借助堆或有序集合可把更新和清理控制在 O(log m)。
做题时怎么分配时间
- 前十分钟把字段含义、去重键和排序要求写清楚;样例能过不代表重复事件能过。
- 每做完一个核心函数就补两类测试:相同事件重放,以及边界金额或跨月记录。
- 最后留出一段时间检查输入解析。CodeSignal 里,格式错误会直接吞掉本来已经写对的逻辑。
FAQ
Ramp OA 需要先刷很多金融题吗?
重点不是金融术语,而是把状态、规则和异常输入写得清楚。用消费、账单或审批做练习场景,主要是为了逼自己处理金额精度、去重和优先级。
代码写完后还该检查什么?
先跑空输入、重复 ID、同一分钟多条记录和金额临界值;这些比继续微调变量名更容易发现问题。
参考来源
关于 CSINTERVIEWHELP
如果你在准备 Ramp OA,做完题后最好把状态设计、测试用例和复杂度讲一遍。无论是 OA 题型解析、OA 辅导、VO 辅助、VO 模拟面试、VO 面试陪练还是系统设计辅助,都可以看看 CSINTERVIEWHELP 的服务,把练习从“能跑”推进到“能解释”。
