我正在尝试解决FreeCodeCamp上的算法挑战。
以下是问题的提示:
设计一个收银抽屉功能checkCashRegister(),它接受购买价格作为第一个参数(价格),付款作为第二个参数(现金),以及现金抽屉(cid)作为第三个参数。
cid是列出可用货币的二维数组。
如果出入金额小于,则返回字符串“资金不足” 变更到期。如果抽屉中的现金相等,则返回字符串“已关闭” 到了应有的变化。
否则,返回硬币和账单的变化,按最高排序 最低阶。
我的解决方案适用于大多数参数,但以下情况除外:
checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]])
应该返回:[["QUARTER", 0.50]]
checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]])
应该返回:[["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15.00], ["ONE", 1.00], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]]
function checkCashRegister(price, cash, cid) {
var change = 100 * (cash - price);
var availableFunds = 0;
var moneyValues = [1, 5, 10, 25, 100, 500, 1000, 2000, 10000];
var amtToReturn = [];
for (var i = cid.length - 1; i >= 0; i--){
var amt = 0;
while (moneyValues[i] <= change && cid[i][1] > 0 && change > 0){
console.log("subtracting " + moneyValues[i]);
cid[i][1] -= moneyValues[i]/100; // reduce amount in cid
change -= moneyValues[i]; // reduce amount from change
amt += moneyValues[i]/100; // keep track of how much money was taken out of cid
}
if (amt !== 0){
// adds record of amount taken out of cid
amtToReturn.push([cid[i][0], amt.toFixed(2)]);
}
}
// if there is still some change left over
if (change !== 0){
console.log("broke");
console.log(change);
return "Insufficient Funds";
}
// if there is any money left in cid, it returns amtToReturn
for (var j = 0; j < cid.length; j++){
if (cid[j][1] > 0){
console.log(amtToReturn);
return amtToReturn;
}
}
// if register is empty
console.log("closed");
return "Closed";
}
// Example cash-in-drawer array:
// [["PENNY", 1.01], 0
// ["NICKEL", 2.05], 1
// ["DIME", 3.10], 2
// ["QUARTER", 4.25],3
// ["ONE", 90.00], 4
// ["FIVE", 55.00], 5
// ["TEN", 20.00], 6
// ["TWENTY", 60.00],7
// ["ONE HUNDRED", 100.00]]8
checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);
我使用分钱的金额来避免任何浮点精度误差。我觉得某个地方只有一个小虫子阻止我完成这个问题。
答案 0 :(得分:1)
他们显然希望将数字作为["BILL", value]
数组的第二个条目。
只需替换:
amtToReturn.push([cid[i][0], amt.toFixed(2)]);
使用:
amtToReturn.push([cid[i][0], amt]);
你应该全力以赴。