Stripe SDE 电面复盘|手续费计算,从查表到阶梯费率与 fixed cost
Stripe 的 SDE 电面里,这道手续费计算被拆成三个 Part,接在同一份代码上。第一版只要求按支付方式和国家查费率,第二版换成阶梯计费,第三版再混入 fixed 与 percentage 两种规则。真正被看的是第二、三次改动:你知不知道哪些结构该保留,哪些地方必须重写。
三个 Part 不是三道独立题。第一版建好「交易 → 费率」的索引,第二版把「整笔乘一个费率」换成「金额分段后分别相乘」,第三版再把「每一段收多少钱」变成按类型分派的一步。每一层都得保住上一层已经说好的输入输出,结构比某一段的具体写法更重要。
这道题在考什么
连续加需求是这类电面的常见形式,考的是改动能力:新规则进来时,你能不能判断哪一块可以留着、哪一块必须重写,并且把判断讲出来。整段重写一遍也许能跑通,但面试官看不到你的取舍。
沟通也是被观察的部分。面试官通常边加需求边追问:为什么这样拆、档位乱序怎么办、金额精度怎么处理。先把改动点和不变的部分讲清楚,再动手,比闷头改代码更容易拿到正向反馈。
这道题里可以一直守住的不变量有四条:
- 返回顺序与输入顺序一致;
- 每笔交易的固定费用 30 只加一次;
- 原始
amount不被覆盖,每一档都从它重新切; - 档位按
minAmount升序处理,不依赖输入顺序。
后面每加一个 Part,先确认这四条有没有被破坏,再谈新逻辑。
Part 1:按支付方式和国家查费率
题目
transactions 里每条记录带 amount、payment_provider、buyer_country;feeRules 给出「支付方式 + 国家」对应的百分比费率;此外每笔交易再收 30 的固定费用。要求返回每笔交易的手续费。
思路
把 (payment_provider, buyer_country) 拼成元组当 key,先把 feeRules 读进字典。遍历交易时查一次表,用 amount × rate ÷ 100 + 30 算出结果,按原顺序写入返回数组。查表是 O(1),整体 O(n)。
两个细节值得当场确认。费率写成 2.3 指的是 2.3%,计算时要除以 100;组合 key 查不到时,是返回 0、报错还是跳过这笔,三种处理的结果完全不同。固定费用放在公式末尾,是为了后面改档位时不必再回头找它。
开场先说什么
开口先讲「我要一个 O(1) 的索引,key 是支付方式和国家的组合」和「固定费每笔只加一次」。这两句说完,面试官基本能确认你抓到了骨架,后面加需求也会顺着你的结构走。
Part 2:金额拆到档位,逐档计费
题目
同一个 provider + country 不再只有一个费率,而是一组档位,每档给出 minAmount、maxAmount、variableRate。一笔金额可能落在多档里,要分段计费再相加;每笔 30 的固定费仍然只收一次。
思路
字典的 value 从「一个费率」换成「档位列表」,先按 minAmount 排序。对每一档,先算出这笔金额落在该档的部分:max(0, min(amount, maxAmount) − minAmount),再乘这一档的费率;各档相加,最后加 30。
最容易写错的是拿「扣完上一档剩下的钱」去和下一档的绝对上下界比较。保留原始 amount,每档都从原金额重新切,公式只依赖档位边界,循环顺序就不会影响结果。
举个说明用例:前 100 按 2% 计费,接下来的 100 按 1%。金额 150 应算成 100 × 2% + 50 × 1% + 30 = 32.5;把整笔 150 乘 1% 得到 31.5,少算了第一档高出的那 1。
还有一处题面通常不写全:超出最后一档按什么算。是沿用最后一档、按 0 计费,还是报错?先问清楚再写兜底,不要默默套用最后一个费率。
Part 3:档位加 type,fixed 与 percentage 混排
题目
每个档位多一个 type 字段。percentage 按落入该档的金额乘费率;fixed 表示只要进入这一档,就收一次固定的 cost,与金额大小无关。交易级的 30 仍然保留。
思路
分段逻辑不动,只把「这一档收多少钱」拆成一个分支:percentage 走原来的乘法,fixed 直接加 cost。外层循环、边界计算、排序都不用重写,改动集中在几行,讲解时也容易说清。
三个容易踩的点:
- 30 不能跟着档位循环走,否则每一档都会多收一次;
- 跨过多个 fixed 档位时各收一次,不是只收最后一个;
- fixed 档位贴在边界、但落入该档的金额为 0 时收不收,题面往往没写,要单独确认——这个判断不能用同一个 ≤ 号顺手带过去。
时间宽裕的话可以补一句「把 fixed 看成金额为 0 的特殊档位会更统一」,但先确认这种抽象与题面一致,别为了优雅改掉行为。
现场怎么讲
这类一题三改的电面,写代码的时间通常够,讲清楚的时间不够。可以按这个顺序推进:
- 1. 复述输入输出,确认金额单位(元还是分)、返回顺序、查不到规则时的行为;
- 2. 说清这一版的结构,再动手;
- 3. 每加一个 Part,先讲哪些东西不变,再讲改哪里;
- 4. 写完主动报一遍边界用例,不要等面试官来问。
追问里高频出现的是精度:浮点能不能用、要不要每档四舍五入、什么时候转成最小货币单位。比较稳的回答是——演示阶段可以用浮点,但会说明最终实现换成整数分或 Decimal,并且只在一处做舍入;每档各自舍入会把误差叠起来。
被问到没把握的部分,给出两种解释、说明你选哪个、为什么,比含糊带过更容易把对话接下去。
练习检查清单
自己计时练这道题时,至少把这组输入跑一遍:
- provider + country 组合缺失;
- 金额为 0、为 1 分;
- 金额刚好等于档位边界;
- 一笔金额跨三个档位;
- 金额超过最高档;
- 档位列表乱序输入;
- fixed 档位贴边、但金额为 0;
- 多笔交易混排,确认 30 每笔只加一次;
- 0.1 + 0.2 这类精度检查。
每条都先写预期结果再运行。只跑通样例不算完成——这道题的分差基本都在边界上。
FAQ
这是 OA 还是电面?
电面 Coding。Stripe 的 OA 更偏多段业务模拟,电面更看当场改代码和解释取舍,两者的准备方式要分开。
每一档都要四舍五入吗?
默认不是。先把单位和舍入规则问清楚,通常只在最终结果或落账那一步舍入;每档单独舍入会累积误差。
交易级的 30 和 fixed 档位的 cost 有什么区别?
30 每笔交易收一次,与档位无关;cost 属于某个 fixed 档位,进入几个 fixed 档就收几次。
能用浮点数算钱吗?
演示可以,但要主动说明最终会换成整数分或 Decimal。面试官更在意你是否知道浮点在金额上的问题,而不是你此刻用了什么类型。
面试官临时加规则怎么办?
先说改动点和不变的部分,再改代码。直接埋头重写,会让前面讲好的结构失去意义。
参考来源
以下资料用于了解 Stripe 电面的题型与追问方式。本文的题面结构和说明用例按公开分享整理,具体题面以实际面试为准。
联系 VOPathway
如果你想把这类一题多改的电面练成固定流程,可以把目标岗位、面试时间、目前的卡点发给 VOPathway——比如边界用例想不到、改第二版时不敢动结构、英文讲解跟不上。我们会据此安排一次针对性的模拟与复盘。
- 微信:Coding0201
- 邮箱:[email protected]
- Telegram:@OAVOProxy
- WhatsApp:+86 178 6396 8105
提供 VO辅助、VO辅导、OA辅助与 OA辅导,围绕模拟面试、现场表达和面后复盘制定训练计划。文章用于训练参考,不代表 Stripe 的官方流程,具体安排以收到的通知为准。
本文用于面试准备与训练复盘。公司名称仅用于标识题型素材主题,不代表官方合作或录用承诺。
预约一次训练复盘 ↗