Exact Change(FCC高级算法)
设计一个收银程序 checkCashRegister()
,其把购买价格(price
)作为第一个参数 , 付款金额 (cash
)作为第二个参数, 和收银机中零钱 (cid
) 作为第三个参数.
cid
是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 "Insufficient Funds"
. 如果正好则返回字符串 "Closed"
.
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.
重点:
两位小数的减法运算会出错(用谷歌调试的时候发现的),所以我把所有数值都扩大了100倍计算
function checkCashRegister(price, cash, cid) { var nums = [10000, 2000, 1000, 500, 100, 25, 10, 5, 1]; var num = cash*100 - price*100; cid = cid.reverse(); var arr = new Array(); for(i=0; i<10 ;i++){ arr[i] = new Array(); } var j = 0; var sum = 0; var bool = false; nums.forEach( function(element, index) { // statements sum=0; while(num >= element){ //下面这段代码时为了加快计算的 var cid1 = cid[index][1]*100; if( cid1>= element){ if(num >= cid1){ num -= cid1; sum +=cid1; cid[index][1] -= cid1/100; }else { num -= element; sum +=element; cid[index][1] -= element/100; } bool = true; arr[j][0] = cid[index][0]; arr[j][1] = sum/100; } else { break; } } if(bool){ j++; bool = false; } }); //删除掉多余的数组项 for (var i = 0; i < arr.length; i++) { if(arr[i] == ""){ arr.splice(i,1); i--; } } // 计算结束如果num还是>0则表示钱不够找0 if(num > 0)return "Insufficient Funds"; //在num=0的基础上 如果钱柜所有钱都找零用完了 if( cid.every(function(a,b,c){ return a[1] === 0; })) return "Closed"; //在钱柜还有钱 num0 的基础上 返回找零出去的信息 return arr; }