题目:
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数.
cid 是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 “Insufficient Funds”. 如果正好则返回字符串 “Closed”.
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.
代码:
<script type="text/javascript">
function checkCashRegister(price, cash, cid) {
var change;
var payback = {
'PENNY': 1,
'NICKEL': 5,
'DIME': 10,
'QUARTER': 25,
'ONE': 100,
'FIVE': 500,
'TEN': 1000,
'TWENTY': 2000,
'ONE HUNDRED': 10000
};
//找零
change = (cash - price) * 100;
console.log('需要找零:' + change);
var keys = Object.keys(payback);
var i = keys.length - 1;
var cidObj = {};
var objCopy = {};
for (i in cid) {
cidObj[cid[i][0]] = cid[i][1] * 100;
//复制一份,不能直接使用赋值语句
objCopy[cid[i][0]] = cid[i][1] * 100;
}
console.log(cidObj);
//遍历收银机中的零钱和最小零钱单位
while (i >= 0) {
while (payback[keys[i]] <= change && cidObj[keys[i]]) {
change -= payback[keys[i]]; //如果要找零的钱大于最小找零单位且其中有钱,从其中找零
cidObj[keys[i]] -= payback[keys[i]]; //找零后从零钱盒中减去已找零费用
}
i--;
}
console.log(cidObj);
var result = [];
//如果遍历之后change不为0,说明零钱不够找不开
if (change) {
return "Insufficient Funds";
}
for (i in cidObj) {
if (cidObj[i]) {
break;
} else if (i === keys[keys.length - 1]) {
return "Closed";
}
}
for (i in objCopy) {
if (objCopy[i] !== cidObj[i]) {
result.unshift([i, (objCopy[i] - cidObj[i]) / 100]);
}
}
return result;
}
</script>
参考资料:
https://www.jianshu.com/p/6b76d60d8f49