Technology Intern · Power Day Technical Coding

Capital One 月度商户 Cashback:费率匹配与交易汇总

Technology Intern Power Day coding 给不同返现费率和交易,计算一个月各商户获得的 Cashback;明确金额口径、退款与排序。

题目重点:Technology Intern Power Day coding 给不同返现费率和交易,计算一个月各商户获得的 Cashback;明确金额口径、退款与排序。

题意与假设

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

  • 训练版交易含 id、customerId、merchantId、amountCents、timestamp、status;只计算指定月份且成功的正向购买。
  • 费率按 merchantId 查找,缺商户费率用 defaultRate;若真实题给类别/时间段/叠加优惠,优先级需重新定义。
  • 返现按每笔交易以整数最小单位计算并指定舍入;训练版每笔向下取整,不把浮点误差混入金额。
  • 输出按商户返现总额降序、商户 ID 升序;题目只说‘哪些商家多’,排序格式为训练约定。

解题路线

  1. 先向面试官列出 rate 适用范围、有效月份/时区、成功/退款交易、金额舍入和是否按用户/商户查询。
  2. 遍历交易,先用 transactionId 去重并过滤月份/状态;按适用 rate 算 cashbackCents,再在 map[merchantId] 汇总。
  3. 若退款单独出现,需要关联原交易并按当时费率反向冲销,不能用退款时的新费率;题目未明确此约束,作为追问讨论。
  4. 最终把商户汇总转数组排序;若只需 Top K,可用大小为 K 的堆降低排序成本。
  5. 写可追溯测试:月边界、重复 ID、同商户多交易、0 费率、不同 rate、同分、退款和舍入误差。

手动走一遍

训练示例:商户 A 费率 2%、两笔成功购买 1000/500 cents,各返 20/10,总 30;商户 B 费率 5%、一笔 400 cents,返 20,则 A 排在 B 前。金额、费率与商户均为本文训练数据,题目未明确。

规模与取舍

t 笔交易、m 个不同商户:去重和汇总预期 O(t) 时间、O(t+m) 空间(保留全部 ID);全排序 O(m log m)。若源日志已保证唯一,可不保留 ID;Top K 为 O(m log K)。

易错点与追问

容易失分的边界

  • 把用户消费额直接当 Cashback,没乘费率。
  • 交易金额用二进制浮点累加产生分差。
  • 退款/重复交易按购买再加一次。
  • 用结算月份与发生月份混用却不说明。
  • 费率改变后重算历史交易而未保留适用版本。

继续深挖

  • 不同商户类别、活动加成同时适用如何定优先级?
  • 千万级交易如何流式聚合?
  • 迟到退款怎样更正已出月报?
  • 只需 Top K 如何优化?
✓已复制微信号!