VO辅助 / 面试训练复盘

Stripe SDE 电面复盘|手续费计算,从查表到阶梯费率与 fixed cost

Stripe 的 SDE 电面里,这道手续费计算被拆成三个 Part,接在同一份代码上。第一版只要求按支付方式和国家查费率,第二版换成阶梯计费,第三版再混入 fixed 与 percentage 两种规则。真正被看的是第二、三次改动:你知不知道哪些结构该保留,哪些地方必须重写。

Stripe 手续费计算三阶段图解:费率查表、金额拆档、fixed 固定费与百分比费率
训练主题配图 · 非客户现场证明

三个 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 的官方流程,具体安排以收到的通知为准。

每一步,都更接近准备充分的自己。

本文用于面试准备与训练复盘。公司名称仅用于标识题型素材主题,不代表官方合作或录用承诺。

预约一次训练复盘 ↗