首页 > 代码库 > FCC 高级算法题 收银机找零钱

FCC 高级算法题 收银机找零钱

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 高级算法题 收银机找零钱