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)
添加回答
舉報