FCC 高级算法 Exact Change
2017-07-16 本文已影响71人
a1838b5b5d28
目标
设计一个收银程序 checkCashRegister() ,其把购买价格(price)作为第一个参数 , 付款金额
(cash)作为第二个参数, 和收银机中零钱 (cid) 作为第三个参数.
cid 是一个二维数组,存着当前可用的找零.
当收银机中的钱不够找零时返回字符串 "Insufficient Funds". 如果正好则返回字符串 "Closed".
否则, 返回应找回的零钱列表,且由大到小存在二维数组中.
当你遇到困难的时候,记得查看错误提示、阅读文档、搜索、提问。
这是一些对你有帮助的资源:
Global Object
思路
- 先计算总剩余钱数totalCash 和 需要找零的钱数change
- total<change 则return “不够找零”
- total=change 则 return “正好找零 closed”
- 可以找零了
- 从大额钱币开始找
- 先计算找零change需要当前面值的的最大数量neednum和目前收银机里面剩余钱币的数nownum
- 比较 当前面值需要的数量neeednum 和当前面值剩余的总数量nownum
- 两者取最小值 同时推入数组 然后找零减去相应的数额
- 最后判断 需要的找零change是否等于0 等于零说明找完了 不等于说明零钱不够找不开
代码
function checkCashRegister(price, cash, cid) {
cash*=100; //将美元转换成美分 都是整数便于计算 最后要转换回来
price*=100;
var change=cash-price; //需要的找零
var totalCash=getToalCash(cid); //收银机剩余总钱数
var result=[]; //存放结果数组
console.log("收银机里面的总钱数: "+totalCash+" 需要的找零: "+change);
if(totalCash<change){ //收银机总钱数小于要找零
return "Insufficient Funds";
}
else if(totalCash===change){//收银机总钱数正好等于要找零
return "Closed";
}
if(totalCash>change){//收银机总钱数大于要找零
//遍历数组开始找零
for(let i=cid.length-1;i>=0;i--){
//1:获取需要找零的需要当前面额的最大数量 needNum
var nowValue=transformCoin(cid[i][0]); //当前面值
var needNum=Math.floor(change/nowValue);
console.log("当前面额: "+transformCoin(cid[i][0]));
console.log("需要当前面额的最大数量 needNum: "+needNum);
//2 获取现有的数额最大数量
var nowNum=Math.floor(cid[i][1]*100/nowValue);
console.log("目前收银机里当前面额剩余最大数量nowNum: "+nowNum);
//3 取 needNum 和nowNum 的最小值 作为要取得数量finalNum
var finalNum=Math.min(nowNum,needNum);
console.log("最终需要的当前面额数目为: "+finalNum);
if(finalNum!==0){//进入需要的面值 对其操作
// console.log([cid[i][0],finalNum*nowValue/100]);
result.push([cid[i][0],finalNum*nowValue/100]);
change-=finalNum*nowValue;
}
}
//找零结束 判断找零change最后是否为0
if(change==0){ //change 最后为0 说明完成找零
console.log(result);
return result;
}
else{//change 最后不为0 说明零钱不够 无法完成找零
return "Insufficient Funds";
}
}
function getToalCash(arr){ //获取收银机里面的剩余钱数 传入cid数组
var sum=0;
for(let i=0;i<arr.length;i++){
sum+=arr[i][1]*100;
}
return sum;
}
function transformCoin(coin){ //转换钱币到美分
switch(coin){
case 'PENNY':return 1;
case 'NICKEL':return 5;
case 'DIME':return 10;
case 'QUARTER':return 25;
case 'ONE':return 100;
case 'FIVE':return 500;
case 'TEN':return 1000;
case 'TWENTY':return 2000;
case 'ONE HUNDRED':return 10000;
}
}
}