请编写一个用于收银机的函数 checkCashRegister():它的第一个参数为售价 price、第二个参数为领取金额 cash、第三个参数为收银机內的金额 cid。
cid 是蕴含货币面值的二维数组。
函数 checkCashRegister() 应返回含有 status 属性和 change 属性的对象。
如果收银机內的金额少于应找回的零钱数,或者你无奈返回确切的数目时,返回 {status: "INSUFFICIENT_FUNDS", change: []}。
如果收银机內的金额恰好等于应找回的零钱数,返回 {status: "CLOSED", change: [...]},其中 change 的属性值就是收银机內的金额。
否则,返回 {status: "OPEN", change: [...]},其中 change 键值是应找回的零钱数,并将找零的面值由高到低排序。
货币单位Unit | 面值 |
---|---|
Penny | 0.01美元(PENNY) |
Nickel | 0.05 美元(NICKEL) |
Dime | 0.1 美元(DIME) |
Quarter | 0.25 美元(QUARTER) |
Dollar | 1 美元(ONE) |
Five Dollars | 5 美元(五) |
Ten Dollars | 10 美元(TEN) |
Twenty Dollars | 20 美元(TWENTY) |
One-hundred Dollars | 100美元(ONE HUNDRED) |
上面的抽屉里现金数组示例:
[ ["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]
上面是测试用例:
checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) 应返回一个对象。
checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) 应返回 {status: "OPEN", change: [["QUARTER", 0.5]]}。
checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) 应返回 {status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}。
checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应返回 {status: "INSUFFICIENT_FUNDS", change: []}。
checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应返回 {status: "INSUFFICIENT_FUNDS", change: []}。
checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应返回 {status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}。
代码实现如下:
function checkCashRegister(price, cash, cid) { let change = []; let unit = { "ONE HUNDRED": 100, TWENTY: 20, TEN: 10, FIVE: 5, ONE: 1, QUARTER: 0.25, DIME: 0.1, NICKEL: 0.05, PENNY: 0.01, } let cidUnitCount = getUnitCount(cid, unit); let remain = cash - price, isSuit = true; for (let key in unit) { if (unit[key] <= remain) { const unitPrice = unit[key]; const unitTotalCount = cidUnitCount[key]; let curTotalPrice = 0, curCount = 0; while (curTotalPrice < remain && curCount < unitTotalCount) { curCount++; curTotalPrice = curCount * unitPrice; } if (curTotalPrice > remain) { curCount--; curTotalPrice = curCount * unitPrice; } if (curCount !== 0) { change.push([key,curTotalPrice ]); remain = (remain - curTotalPrice).toFixed(2); } if (curCount !== unitTotalCount) { isSuit = false; } } } let result; if (remain == 0) { if (isSuit) { result = { status: "CLOSED", change: cid }; } else { result = { status: "OPEN", change: change }; } } else { result = { status: "INSUFFICIENT_FUNDS", change: [] }; } return result;}function getUnitCount(arr, unit) { let result = {}; arr.forEach(item => { const [key, value] = item; result[key] = Math.round(value / unit[key]); }) return result;}checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]);checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])