FCC 高级算法 Exact Change

2017-07-16  本文已影响71人  a1838b5b5d28

目标

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

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

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

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

当你遇到困难的时候,记得查看错误提示、阅读文档、搜索、提问。

这是一些对你有帮助的资源:

Global Object

思路

  1. 先计算总剩余钱数totalCash 和 需要找零的钱数change
    1. total<change 则return “不够找零”
    2. total=change 则 return “正好找零 closed”
  2. 可以找零了
    1. 从大额钱币开始找
    2. 先计算找零change需要当前面值的的最大数量neednum和目前收银机里面剩余钱币的数nownum
      1. 比较 当前面值需要的数量neeednum 和当前面值剩余的总数量nownum
      2. 两者取最小值 同时推入数组 然后找零减去相应的数额
      3. 最后判断 需要的找零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;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读