美文网首页
FCC 高级算法 Exact Change

FCC 高级算法 Exact Change

作者: a1838b5b5d28 | 来源:发表于2017-07-16 13:59 被阅读71次

    目标

    设计一个收银程序 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;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:FCC 高级算法 Exact Change

          本文链接:https://www.haomeiwen.com/subject/aobtkxtx.html