• [Advanced Algorithm]


    题目

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

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

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

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

    提示

    Global Object

    测试用例

    • checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 应该返回一个数组.
    • checkCashRegister(19.50, 20.00, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回一个字符串.
    • checkCashRegister(19.50, 20.00, [["PENNY", 0.50], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应该返回一个字符串.
    • checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 应该返回 [["QUARTER", 0.50]].
    • checkCashRegister(3.26, 100.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]) 应该返回 [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]].

    分析思路

    这个就是平时的自动找零机需要做的代码。主要是要构建现金面值数组,从大到小找零即可,具体分析见代码注释。

    代码

    function checkCashRegister2(price, cash, cid) {
      // 1. 定义现金面值,通过 100 倍变换为整数,方便计算
      var cashValMap = [
        ["ONE HUNDRED", 10000],
        ["TWENTY", 2000],
        ["TEN", 1000],
        ["FIVE", 500],
        ["ONE", 100],
        ["QUARTER", 25],
        ["DIME", 10],
        ["NICKEL", 5],
        ["PENNY", 1]
      ];
      
      // 2. 计算找零的总数
      var change= Math.round((cash - price) * 100);
      
      // 3. 转换 cid 数组为对象,并且加入 total 表示零钱总数
      var cidObject = cid.reduce(function(arr, cur) {
        arr[cur[0]] = Math.round(cur[1] * 100);
        arr.total += arr[cur[0]];
        return arr;
      }, {total: 0});
      
      // 4. 判断如果零钱总数和需要找零一样,则返回 closed
      if (cidObject.total == change)
        return "closed";
      
      // 5. 判断如果零钱总数小于找零数目,则返回 Insufficient Funds
      if (cidObject.total < change)
        return "Insufficient Funds";
      
      // 6. 从大到小遍历现金面值,比较零钱数,计算出合适的找零数目,返回找零数组
      var retArr = cashValMap.reduce(function(acc, cur) {  
        var tmp = Math.min(Math.floor(change / cur[1]) * cur[1], cidObject[cur[0]]);
        
        change -= tmp;
        
        if (tmp > 0) {
          acc.push([cur[0], parseFloat((tmp / 100).toFixed(2))]);
        }
        
        return acc;
      }, []);
      
      // 7. 判断是否零钱足够组合成需要的找零数
      if (change !== 0)
        return "Insufficient Funds";
      
      return retArr;
    }
    
  • 相关阅读:
    第十一作业
    第十次作业
    06 逻辑回归
    05 线性回归算法
    04 K均值算法--应用
    03 K均值算法
    02 机器学习相关数学基础
    01 机器学习概述
    15 语法制导的语义翻译
    014 算符优先分析
  • 原文地址:https://www.cnblogs.com/water-moon/p/6912405.html
Copyright © 2020-2023  润新知