1. 程式人生 > >FCC 高級算法題 收銀機找零錢

FCC 高級算法題 收銀機找零錢

對象 org tar uart price str urn object lin

Exact Change


設計一個收銀程序 checkCashRegister() ,其把購買價格(price)作為第一個參數 , 付款金額 (cash)作為第二個參數, 和收銀機中零錢 (cid) 作為第三個參數.

cid 是一個二維數組,存著當前可用的找零.

當收銀機中的錢不夠找零時返回字符串 "Insufficient Funds". 如果正好則返回字符串 "Closed".

否則, 返回應找回的零錢列表,且由大到小存在二維數組中.

Global Object

代碼:

 1 function checkCashRegister(price, cash, cid) {
 2         var
obj = {}; 3 var num = 0; 4 var odd = cash - price; 5 var arr = []; 6 var newArr = []; 7 var a = 0; 8 9 for (var i = 0; i < cid.length; i++) { 10 //把這個二維數組的第一項和第二項分別變為新建對象的屬性和屬性值 11 var s = cid[i][0]; 12 obj[s] = cid[i][1];
13 //累加得出收銀機零錢的總和 14 num += cid[i][1]; 15 } 16 if (odd === num) { 17 //如果收銀機中的錢num和需要找的錢odd相等,返回字符串“Closed” 18 return "Closed"; 19 } 20 for (var j = 0; j < Object.keys(obj).length; j++) { 21 //遍歷對象屬性 22 var name = Object.keys(obj)[8 - j];
23 //新建一個關於美元數額的數組 24 var figure = [100, 20, 10, 5, 1, 0.25, 0.1, 0.05, 0.01]; 25 26 fi1(); 27 28 if (a > 0) { 29 arr.push([name, figure[j] * a]); 30 a = 0; 31 } 32 } 33 function fi1() { 34 if (odd >= figure[j] && obj[name] >= figure[j]) { 35 //判斷odd,如果大於某一面額的鈔票且在收音機中有該面值的鈔票 36 odd = odd - figure[j]; 37 //js的精度問題,2=1.999999,所以要用Math.round()來四舍五入 38 odd = Math.round(odd * 10000) / 10000; 39 obj[name] = obj[name] - figure[j]; 40 obj[name] = Math.round(obj[name]); 41 //這個a是用來判斷是否有多張統一面值的鈔票,這個在上面的if語句中用來給空數組arr添加元素 42 a += 1; 43 fi1(); 44 } 45 } 46 if (odd === 0) { 47 //如果可以找零並且有剩余,就返回一個應找回的零錢列表 48 return arr; 49 } else if (odd > 0) { 50 //如果收音機中的錢不夠找零時,返回字符串"Insufficient Funds" 51 return "Insufficient Funds"; 52 } 53 } 54 55 checkCashRegister(19.50, 20.00, [ 56 ["PENNY", 0.50], 57 ["NICKEL", 0], 58 ["DIME", 0], 59 ["QUARTER", 0], 60 ["ONE", 0], 61 ["FIVE", 0], 62 ["TEN", 0], 63 ["TWENTY", 0], 64 ["ONE HUNDRED", 0] 65 ]);

FCC 高級算法題 收銀機找零錢