FreeCodeCamp---advanced Algorithm Scripting解法

Exact Change

设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额 (cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数.

cid 是一个二维数组,存着当前可用的找零.

当收银机中的钱不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed".

否则, 返回应找回的零钱列表,且由大到小存在二维数组中.

 1 function checkCashRegister(price, cash, cid) {
 2   var arr=[];  //应找回的零钱列表
 3   var cashPrice=[];  //一种钱代表的金额
 4   var cashName=[];  //钱的名字
 5   var cashItemSum=[];  //一种钱的总数
 6   var change=Math.round((cash-price)*100)/100;   //要找回的零钱
 7   var sumCash=0;
 8   cid.forEach(function(item,index,array){
 9     if(item[1]>0){
10       cashName.push(item[0]);
11       cashItemSum.push(item[1]);
12       sumCash += item[1];
13     }
14   });
15   
16   cashPrice=cashName.map(function(item,index,array){
17     switch (item){
18       case "PENNY":
19         return 0.01;
20       case "NICKEL":
21         return 0.05;
22       case "DIME":
23         return 0.1;
24       case "QUARTER":
25         return 0.25;
26       case "ONE":
27         return 1;
28       case "FIVE":
29         return 5;
30       case "TEN":
31         return 10;
32       case "TWENTY":
33         return 20;
34       case "ONE HUNDRED":
35         return 100;
36     }
37   });
38   
39   
40   sumCash=Math.round(sumCash*100)/100; //对sumCash保留两位小数
41     
42   switch (true){
43     case change>sumCash:
44       return "Insufficient Funds";
45     case change === sumCash:
46       return "Closed";
47     default:
48       approachChange(change);
49       if(arr.length===0){
50         return "Insufficient Funds";
51       }else{
52         return arr;
53       }
54   }
55   
56   
57   
58   function approachChange(change){
59     var index=0;
60     if(change>cashPrice[cashPrice.length-1]){
61       index=cashPrice.length-1;
62     }
63     
64     for(var i=0; i<cashPrice.length-1; i++){
65       if(cashPrice[i]<=change && change<cashPrice[i+1] && cashItemSum[i]!==0){
66          index=i;
67       }
68     }
69    
70     var itemNeedSum=Math.floor(change/cashPrice[index]) * cashPrice[index];
71     var needMin=Math.min(itemNeedSum,cashItemSum[index]);
72     var x=Math.round( (change-needMin)*100 )/100;
73     
74     if(x>0 && index===0){
75       return;
76     }
77     
78     arr.push([cashName[index], needMin]);      
79     
80     
81     if(x===0){
82       return;
83     }else{
84       cashPrice=cashPrice.slice(0,index);
85       approachChange(x);
86     }  
87   }
88   
89 }
90 
91 
92 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]]);
View Code

 

posted @ 2017-03-29 21:25  JaceyKan  阅读(337)  评论(0编辑  收藏  举报