Splitwise:分清每笔开销,也减少最后的转账
Splitwise 帮助朋友、室友和家人记录共同开销,算清各自还应付出或收回多少。群组可以保留每笔费用,再把最后的结清关系整理得更简单。
先尝试拆解问题、设计和实现,再展开思路,检查状态、边界与取舍,并设计验证用例。思路提供分析路径,不给出完整实现。
01
代码思考
均分金额时保住每一分钱
为一个分账页面实现均分金额的小模块。10 元分给三个人时,不能把每个人都写成 3.33 元而少算一分钱;页面和保存记录应使用同一份计算结果。
- 输入: 实现 splitEvenly(totalCents, memberIds)。totalCents 是非负整数金额,单位为分,范围为 0 到 1000000;memberIds 是非空的成员编号数组,编号互不重复,最多 20 人。输入保证符合这些条件。
- 规则: 返回按输入顺序排列的 {id, cents} 列表。每个人尽量均分,剩余不足均分的一分钱依次分给列表靠前的人;任何两人的分配最多相差一分,总和必须等于 totalCents。同一输入应得到同一结果,不修改输入。金额转成“元”的显示文字由页面负责。
- 验收: 1000 分与 [A,B,C] 得到 A:334、B:333、C:333;2 分与 [A,B,C] 得到 A:1、B:1、C:0;0 分与 [A,B] 得到 A:0、B:0。
- 交付: 用熟悉的语言实现函数,运行这三个例子,检查分配总和,并简短说明为什么计算接口使用整数分而不是显示文字。无需连接账号或真正付款。
查看思路
- 先把金额计算与页面格式化分开,选择能精确表示一分钱的内部单位。
- 考虑怎样处理不能均分的部分,使每个人差距不超过一分,同时让多次计算遵守同一顺序。
- 用 1000、2 和 0 分三个例子核对总额与顺序;特别检查人数多于分数时是否错误地给每个人都分了一分。