SWE / Intern / New Grad · Technical Screen / Team Screen

Stripe Shipping Cost:国家商品价与数量分段定价

逐件增量、整档固定和混合定价是不同规则;用半开区间统一边界并检验订单成本。

题目重点:逐件增量、整档固定和混合定价是不同规则;用半开区间统一边界并检验订单成本。

题意与假设

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

  • 训练版每个订单项给 product、quantity,country 决定商品价格表;非负整数数量,金额用整数最小货币单位。
  • 增量版区间 [lo,hi) 每件落档计价,hi=null 表示无上限,费用为 Σ 档内件数×单位价;fixed 版整项数量落某档后直接取该档总价。
  • 若题面把商品本身售价也计入 total,另加 item price;不能在只有 shipping 费率表时凭空加商品售价。

解题路线

  1. 先解析 country 与 items,查不到国家或商品时按题目规定报错/跳过,不默认免费。固定价版逐项做 quantity×rate 并累加。
  2. 分段版先按 lo 排序并验证无重叠、无意外空档。对订单数量 q,逐档取 overlap=max(0,min(q,hi)-lo);hi=null 当作 q,累加 overlap×rate。
  3. 整档 fixed 不累计前面档,定位唯一包含 q 的区间直接返回该档价;同一配置若同时支持两种类型,让 rateType 决定计算器,避免共用含糊的 cost 字段。
  4. 先用 q=0、每个 lo/hi 边界、超最后有界档、重复商品行与多国家订单做表驱动测试,再讨论预排序或缓存。

手动走一遍

训练例增量档 [0,2) 每件 5、[2,5) 每件 3、[5,∞) 每件 1。买 6 件费用 2×5+3×3+1×1=20。若同一档表表示 fixed,总价应由覆盖数量 6 的档给出 1,而不是 20;这个刻意不合理的数值说明两种语义绝不能混用。

规模与取舍

I 个订单项、每商品 T 个档:已验证且有序时线性扫描 O(I T),配置预排序 O(T log T),单次查档可二分 O(log T) 但增量价仍可能跨多个档。额外空间 O(T) 取决于是否复制排序。

易错点与追问

容易失分的边界

  • 把 quantity 落入的单价乘整个数量,误实现增量阶梯价。
  • 对 fixed 档仍把所有低档加起来。
  • 闭区间/半开区间混用,使临界数量重复收费。
  • maxQuantity=null 当成 0 或遇到缺档时默默免费。

继续深挖

  • 订单更改数量时怎样增量计算价差?
  • 同一商品有重叠规则时应拒绝配置还是定义优先级?
  • 若国家费率变动,需要按下单时版本还是结算时版本计费?
✓已复制微信号!