SWE / New Grad · Technical / Team Screen

Stripe Transaction Fees:CSV 手续费与商户 Provider 阈值免收

把费率规则和累计交易阈值分开,以 (merchant,provider) 为键决定后续免手续费,明确跨阈值当笔的口径。

题目重点:把费率规则和累计交易阈值分开,以 (merchant,provider) 为键决定后续免手续费,明确跨阈值当笔的口径。

题意与假设

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

  • 训练版输入经标准 CSV 解析,金额为整数最小单位,交易顺序等于列表顺序;题目未明确完整列顺序与 fee table,不能写死具体 51/101 的来源含义。
  • 基础费函数 base_fee(type,provider,status,amount) 由题面提供的规则表注入;只有有效且成功的 payment 计入累计,失败/退款是否计入要按现场规则改。
  • 训练版按‘后面交易免’理解:处理当前笔前若 prior cumulative>10000 则当前 fee=0,随后把当前合格 amount 加到 (merchant,provider) 累计;当笔使累计超过阈值时仍按基础费收。题目对恰等于 10000 与当笔边界不完整。

解题路线

  1. 先 parse 每行并验证必需字段、数值和 status;输出是原输入行顺序的 id,type,provider,fee,金额格式与分隔符保持指定样式。
  2. 纯函数 base_fee 处理 Part 1/2 的状态、类型和 provider 费率;把规则数据与计算器分离,避免在流式循环里写交叉条件。若费率缺失,显式报错或按题目定义 fallback。
  3. Part 3 用 cumulative[(merchant,provider)] 记录已计入交易总金额。先读取 prior,决定本笔 fee 是否免,再依据合格条件更新累计;不要只按 provider 累计,也不要把不同 merchant 的费用等级混在一起。
  4. 测试两个 merchant 同 provider、同 merchant 不同 provider、9999→10000→10001、负额/退款、失败状态、重复 id 和含引号逗号的 CSV 字段。重复 id 是否去重属于题面缺口,真实结算应有幂等策略。

手动走一遍

训练例商户 M 在 card provider 之前已累计 9900,下一笔 200 的基础费为 5:若采用‘后续免’合同,该笔仍收 5,累计变 10100;再下一笔 card 支付免收。另一个商户 N 即使 card 累计为 0,也不能继承 M 的免收资格。

规模与取舍

T 笔交易、K 个不同 (merchant,provider) 组合,解析/计费期望 O(T) 时间、O(K) 状态空间,另加输出 O(T)。若按日或账期重置阈值,键需加账期并处理跨期结算。

易错点与追问

容易失分的边界

  • 只按 provider 计累计,所有商户共享阈值。
  • 先把当前金额加到累计后再判断,改变‘后续’语义。
  • 没有基础费率证据却反推 51/101 是固定公式。
  • 用 float 计货币,边界 10000 附近出现精度误差。
  • 状态/退款/失败交易全部计入累计,没有业务依据。

继续深挖

  • 恰好 10000、当笔跨过 10000、下一笔是否免,分别如何写成测试?
  • 退款或撤销后累计是否回退,已免手续费要不要补收?
  • 并发同 merchant/provider 交易怎样原子更新累计?
✓已复制微信号!