3 回答
TA贡献1942条经验 获得超3个赞
您的代码会先检查较小的钞票,然后再检查较大的钞票,这显然是错误的:您希望在使用 1 美元钞票之前拥有尽可能多的 1000 美元钞票。因此,您可以反转帐单数组,或者只是对其进行排序以使其反转:
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;
}
TA贡献1775条经验 获得超8个赞
您的代码当前的问题在于它总是与第一个账单相关,而不是最大的账单。您需要找到适合给定金额的最大钞票,以最大限度地减少所需的钞票数量。
假设您尝试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
// (...)
};
TA贡献1735条经验 获得超5个赞
我编写了这段代码,如果您愿意,您可以重构它,但我认为这样就可以了
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)
添加回答
举报