【问题标题】:How do I make this change method, so I get the bills for that given amount [duplicate]如何进行这种更改方法,以便获得该给定金额的账单[重复]
【发布时间】:2020-11-19 01:29:47
【问题描述】:

我有这个任务,我必须将给定数量的钱分成账单。我看不出我做错了什么,因此寻求一些指导。

export function change(amount) {

    var bills = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000];
    var result = [];

    while (amount > 0) {
        for (var i = 0; i < bills.length; i++) {
            if (amount >= bills[i]) {
                amount -= bills[i];
                result.push(bills[i]);
            }
        }
    }
    return result.length;
}

【问题讨论】:

  • 欢迎来到 SO。请考虑使用相关标签标记您的问题。垃圾邮件标签没有效率。也就是说,您的 bills[] 数组以 1.. 开头。也许反转您的 bills 数组可能会有所帮助?
  • 也就是说,请发布您的输入、实际输出和预期输出。
  • 如果if 语句条件为真,则跳出for 循环。哦...并按降序设置您的 bills 数组,而不是像现在这样升序。
  • @DevilsHnd 我不认为这是解决方案
  • 您可能想尝试向后迭代 bills,因为您想先尝试更大的账单,而不是从 1 开始。

标签: javascript


【解决方案1】:

您的代码在检查较大的钞票之前先检查较小的钞票,这显然是错误的:您希望在使用 1 美元钞票之前拥有尽可能多的 1000 美元钞票。因此,您可以反转您的 bills 数组,或者只是对其进行排序以使其反转:

function change(amount) {
    const bills = [1000, 500, 200, 100, 50, 20, 10, 5, 2, 1];
    // alternatively, to sort it
    // bills.sort((a, b) => b - a);
    const result = [];
    for (const bill of bills) {
        const billCount = Math.floor(amount / bill);
        amount = amount % bill;
        result.push(...new Array(billCount).fill(bill));
    }
    return result;
}

【讨论】:

    【解决方案2】:

    您的代码当前的问题在于它总是与 first 账单一起使用,而不是最大的。您需要找到可以容纳给定金额的最大钞票,以尽量减少所需的钞票数量。

    假设您使用当前代码尝试change(100)。它将评估账单 1,看看它是否合适,然后继续处理账单 2,当然这也合适。您当前的程序将重复 bills 作为输出,直到达到目标值。

    您可以通过向后迭代 bills 来解决此问题(从最大的开始),或者您可以简单地反转它并保留您当前的代码。

    这是一个稍微改进的版本,它修复了错误并使用了一些不错的现代 JS 功能。

    const change = function(amount) {
    
        const bills = [1000, 500, 200, 100, 50, 20, 10, 5, 2, 1];
        const result = [];
    
        while(amount > 0) {
            for(const bill of bills) {
                if(amount >= bill) {
                    amount -= bill;
                    result.push(bill);              
                }
            }
        }
    
        // You don't mention what the expected return value is, so completing this function is up to you
        // (...)
        
    };
    

    【讨论】:

    • const bill > let bill :p。如果您将内部if 更改为一段时间,那么外部while 也是多余的。当然,结果值在 OP 中非常清楚,因此使用数组(并逐个减去账单!)有点矫枉过正。 const name = anonymous function 也有点新
    • @somebody 我故意保留外部 while 循环以保持代码类似于 OP,但我同意他们应该接受您的建议
    • 无论如何我不认为const change = function 是“现代js 功能”。当然我认为const 是一个比let 更合适的“现代js 功能”,因为无论如何你都在使用“新功能”
    • @somebody IMO 将函数定义为匿名 const 有点好,因为它可以防止事后修改,但这确实是一个偏好问题。我编辑了帖子以将内部 let 更改为 const,尽管
    • 还要考虑到 OP 无论如何都在导出,所以你可能还是想要那个语法
    【解决方案3】:

    我编写了这段代码,如果你愿意,你可以重构它,但我认为这样就可以了

    function change (amount) {
      let change = {}
      let bills = [1000, 500, 200, 100, 50, 20, 10, 5, 2, 1]
    
      if (amount > 0) {
         bills.map(bill => {
           if(amount > 0 && amount >= bill) {
              let value = amount / bill
    
              if(amount % bill == 0) {
                change[bill.toString()] = value
    
                amount -= value * bill
    
                return
              }
    
              let remainder = amount % bill
    
              change[bill.toString()] = ((value * bill) - remainder) / bill
    
              amount = remainder
           }
         });
      }
    
      return change
    }
    
    this.change(111)
    

    【讨论】:

    • 这个:不起作用,很hacky,并且在应该使用数字时返回字符串。
    • @Aplet123 嗨。还有其他的东西,比如不一致的分号。是的,它不仅是 hacky,而且比正确的方式更难以理解
    • @Aplet123 hacky 是什么意思?
    • 您将数字转换为字符串,然后对它们执行字符串操作,然后将它们转换回数字。这不仅不直观,而且不一致(由于浮点不精确)和缓慢。
    • @Aplet123 你好,我稍微修改一下我的代码,你认为这可行吗?
    猜你喜欢
    • 2017-07-17
    • 2012-03-20
    • 2014-10-28
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 1970-01-01
    • 2010-12-10
    • 2015-03-31
    相关资源
    最近更新 更多