
收银系统算法挑战
方法一:
function checkCashRegister(price, cash, cid) {
var change=[]; //储存结果
var cid_obj={ //存储值和数量
"ONE HUNDRED":{val:100},
"TWENTY":{val:20},
"TEN":{val:10},
"FIVE":{val:5},
"ONE":{val:1},
"QUARTER":{val:0.25},
"DIME":{val:0.1},
"NICKEL":{val:0.05},
"PENNY":{val:0.01}
};
for(var a of cid){
cid_obj[a[0]].num=Math.ceil(a[1]/cid_obj[a[0]].val); //更新不同货币的数量
}
if( price==cash ){
return "Closed";
}else{
var cha=cash-price; //需要找零的钱
for(let k of Object.keys(cid_obj)){
var count=0;
while( cha>=cid_obj[k].val && cid_obj[k].num!==0 ){ //没有完成找零且当前零钱可以找零
cha=(cha-cid_obj[k].val).toFixed(2); //这里需要四舍五入成2位小数,不然会有计算误差
cid_obj[k].num--;
count++;
if( cid_obj[k].num===0 || cha<cid_obj[k].val ){ //如果没零钱了
change.push([k,cid_obj[k].val*count]);
break;
}
}
}
if( cha==0 ){
if( cid_obj["PENNY"].num==0 ){
return "Closed";
}
return change;
}else{
return "Insufficient Funds";
}
}
}
checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]);
方法二:
function checkCashRegister(price, cash, cid) {
var change = cash - price,
totalCash = 0,
rArr = [],
isDone = false;
// Here is your change, ma'am.
cid.forEach(function (arr) {
totalCash += arr[1];
});
if (change > totalCash) {
return 'Insufficient Funds';
} else if (change == totalCash) {
return 'Closed';
} else {
for (var i = cid.length - 1; i >= 0; i--) {
if (cid[i][1] < change) {
if (cid[i][1] !== 0) {
rArr.push(cid[i]);
change -= cid[i][1];
}
if (cid[i][0] === 'PENNY') {
return 'Insufficient Funds';
}
} else {
var t = 0;
switch (cid[i][0]) {
case 'PENNY':
t = Math.round(change * 100) * 0.01;
rArr.push(['PENNY', t]);
change -= t;
if (change >= 0.01) {
return 'Insufficient Funds';
}
break;
case 'NICKEL':
t = parseInt(change / 0.05) * 0.05;
if (t > 0) {
rArr.push(['NICKEL', t]);
change -= t;
}
break;
case 'DIME':
t = parseInt(change / 0.1) * 0.1;
if (t > 0) {
rArr.push(['DIME', t]);
change -= t;
}
break;
case 'QUARTER':
t = parseInt(change / 0.25) * 0.25;
if (t > 0) {
rArr.push(['QUARTER', t]);
change -= t;
}
break;
case 'ONE':
t = parseInt(change / 1) * 1;
if (t > 0) {
rArr.push(['ONE', t]);
change -= t;
}
break;
case 'FIVE':
t = parseInt(change / 5) * 5;
if (t > 0) {
rArr.push(['FIVE', t]);
change -= t;
}
break;
case 'TEN':
t = parseInt(change / 10) * 10;
if (t > 0) {
rArr.push(['TEN', t]);
change -= t;
}
break;
case 'TWENTY':
t = parseInt(change / 20) * 20;
if (t > 0) {
rArr.push(['TWENTY', t]);
change -= t;
}
break;
case 'ONE HUNDRED':
t = parseInt(change / 100) * 100;
if (t > 0) {
rArr.push(['ONE HUNDRED', t]);
change -= t;
}
break;
}
if (change === 0) {
break;
}
}
}
return rArr;
}
}
// Example cash-in-drawer array:
// [["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]]
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"]);