You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript最少找零支付函数异常:无法生成预期支付方案

排查payWithLeastChange函数的错误原因及修复方案

核心错误分析

你的函数返回错误的大概率原因是以下两个逻辑误区:

  1. 强制要求支付金额恰好等于账单金额
    你需要支付的61美元无法用手里的纸币(50、10、5等5的倍数面额)凑出,若函数逻辑是必须凑出与账单完全相等的纸币组合,必然触发错误。但实际场景允许超额支付后用硬币找零(题目中找零4美元为硬币,无需使用用户的纸币)。
  2. 错误将找零纳入纸币凑整逻辑
    如果函数错误地要求找零也必须用用户持有的纸币,而你没有1美元纸币,无法凑出4美元找零,也会导致报错。但正常场景下找零默认使用硬币,不需要消耗用户的纸币储备。

修正后的函数实现

function payWithLeastChange(amountToPay, availableBills) {
  // 按面额从大到小排序,优先用大面额保证纸币数量最少
  const sortedBills = Object.entries(availableBills).sort((a, b) => b[0] - a[0]);
  const usedBills = {};
  let totalPaid = 0;

  // 凑出≥账单金额的最小纸币组合
  for (const [denominationStr, maxCount] of sortedBills) {
    const denomination = parseInt(denominationStr);
    if (totalPaid >= amountToPay) break;

    // 计算当前面额最多能使用的数量:不超过可用数,且累加后尽量接近/超过账单金额
    let useCount = 0;
    while (useCount < maxCount && totalPaid + denomination <= amountToPay + 100) { // 上限设为合理范围即可
      totalPaid += denomination;
      useCount++;
      if (totalPaid >= amountToPay) break;
    }

    if (useCount > 0) {
      usedBills[denomination] = useCount;
    }
  }

  if (totalPaid < amountToPay) {
    return "Error: Not enough bills to make the payment.";
  }

  const change = totalPaid - amountToPay;
  return {
    usedBills: usedBills,
    changeAmount: change,
    result: `支付组合:${Object.entries(usedBills).map(([d, c]) => `${c}张${d}美元`).join('、')},找零${change}美元`
  };
}

// 测试你的场景
const userBills = {
  200: 2,
  100: 1,
  50: 1,
  10: 2,
  5: 3
};
console.log(payWithLeastChange(61, userBills));
// 输出:{ usedBills: { 50: 1, 10: 1, 5: 1 }, changeAmount: 4, result: "支付组合:1张50美元、1张10美元、1张5美元,找零4美元" }

关键逻辑说明

  1. 面额排序:从大到小遍历纸币,确保用最少的纸币数量凑出足够金额。
  2. 超额支付允许:只要累计支付金额≥账单金额就停止凑整,无需严格等于。
  3. 找零独立处理:找零仅计算差值,默认用硬币完成,不依赖用户的纸币储备。

内容的提问来源于stack exchange,提问作者Abrar Anwar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 23:15:36