Exact Change
阿新 • • 發佈:2019-01-22
題目
設計一個收銀程式 checkCashRegister() ,其把購買價格(price)作為第一個引數 , 付款金額 (cash)作為第二個引數, 和收銀機中零錢 (cid) 作為第三個引數.
cid 是一個二維陣列,存著當前可用的找零.
當收銀機中的錢不夠找零時返回字串 “Insufficient Funds”. 如果正好則返回字串 “Closed”.
否則, 返回應找回的零錢列表,且由大到小存在二維陣列中
要求
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]] ) 應該返回一個數組.
checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回一個字串.
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]] ) 應該返回一個字串.
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], ["ONE", 1], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]].
checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回 "Insufficient Funds".
checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1.00], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 應該返回 "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]]) 應該返回 "Closed".
程式碼
function checkCashRegister(price, cash, cid) {
var type_list = [{ type: 'ONE HUNDRED', val: 100.00},
{ type: 'TWENTY', val: 20.00},
{ type: 'TEN', val: 10.00},
{ type: 'FIVE', val: 5.00},
{ type: 'ONE', val: 1.00},
{ type: 'QUARTER', val: 0.25},
{ type: 'DIME', val: 0.10},
{ type: 'NICKEL', val: 0.05},
{ type: 'PENNY', val: 0.01}];
var change = cash - price ;
var total = cid.reduce(function(sum,val) {
sum = sum + val[1];
sum = Math.round(sum*100) / 100;
return sum;
},0);
if(total === change) {
return "Closed";
}
if(total < change) {
return "Insufficient Funds";
}
var cid_list = cid.reduce(function(prev,curr) {
prev[curr[0]] = curr[1];
return prev;
},{});
var temp = change;
var result = type_list.reduce(function(prev,curr) {
var val = 0;
while(cid_list[curr.type] > 0 && change >= curr.val){
change -= curr.val;
cid_list[curr.type] -= curr.val;
val += curr.val;
change = Math.round(change*100) / 100;
}
if(val) {
prev.push([curr.type,val]);
}
return prev;
},[]);
if(change) {
return "Insufficient Funds";
}
return result;
}
// 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", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1.00], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]);