SWE / MLE · Power Day Coding

Capital One Banking Coding:账户、转账与 Top Activity

Power Day 银行类题逐层实现 create/deposit/transfer/TOP_ACTIVITY;活动量按成功交易金额累计,含双方计数和同分 ID 排序。

题目重点:Power Day 银行类题逐层实现 create/deposit/transfer/TOP_ACTIVITY;活动量按成功交易金额累计,含双方计数和同分 ID 排序。

题意与假设

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

  • 训练版账户创建初始 balance=0、activity=0;deposit 正金额且账户存在时加余额与 activity,失败返回与格式依现场签名。
  • transfer(from,to,amount) 必须双方存在、不同 ID、金额>0、来源余额足够;成功时双方 balance 更新,双方 activity 各加 amount。
  • TOP_ACTIVITY(n) 只比较当前仍存在的账户,按 (-activity,accountId);n≤0 返回空。题目未明确删除/合并账户。
  • 余额与活动量使用整数最小货币单位,练习版不推断真实银行账务或并发事务接口。

解题路线

  1. 先把操作返回值与失败副作用列成表,尤其失败转账不能变余额/活动量,重复 create 不能重置旧账户。
  2. 以 accountId→{balance,activity} 的 map 做基线;create 检查唯一性,deposit/transfer 在校验全部通过后一次性提交对应字段。
  3. 成功 transfer 要源/目标双方 activity 各加绝对金额;若金额 A 从 X 到 Y,系统总 activity 增加 2A。这是题目给的活动指标,不等于资金净流量。
  4. 查询 Top N 时复制账户条目,按 activity 降序、ID 升序排序,取前 min(n,accountCount) 并格式化为 id(activity);若操作数和查询数极大再讨论平衡树/增量索引。
  5. 自己搭 string array test harness,把来源给的示例和零账户、同分、失败转账、转账回去、n 超账户数依序跑完;别把示例中混排的预期输出误配到错误操作。

手动走一遍

训练例:创建 a/b;a 存 300(a.balance=300,a.activity=300);a→b 转 200 后 a.balance=100,b.balance=200,activity 分别为 500 与 200;失败的 a→b 转 500 不变。若 c.activity=500,Top 2 在 a/c 同分时按字典序 a 在 c 前。

规模与取舍

Map 的 create/deposit/transfer 预期 O(1) 时间;m 个账户的 Top N 全排序 O(m log m) 时间、O(m) 临时空间,取前 n 输出 O(n)。若频繁 Top N,可维持按 (-activity,id) 的有序索引,成功操作更新 O(log m),但要保证与账户余额写一致。

易错点与追问

容易失分的边界

  • 把 activity 算成操作次数或净余额变化。
  • 成功转账只给来源账户加活动量,漏目标。
  • 失败转账先扣款后校验余额。
  • 同分按最近交易而非账户 ID 升序。
  • 账户 ID 自转或重复 create 被当成功操作。

继续深挖

  • 高并发转账如何原子更新双方?
  • 失败重试与幂等键怎样加入?
  • 若要求历史 Top N 如何做事件重放?
  • 活动量是否包括 withdraw、手续费或退款需怎样扩展?
✓已复制微信号!