收银系统算法挑战

挑战:

参考:收银系统算法挑战

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

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

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

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

例如:

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]].

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]])
应该返回 “Insufficient Funds”.

checkCashRegister(19.50, 20.00,
[[“PENNY”, 0.01], [“NICKEL”, 0], [“DIME”, 0],
[“QUARTER”, 0], [“ONE”, 1.00], [“FIVE”, 0],
[“TEN”, 0], [“TWENTY”, 0], [“ONE HUNDRED”, 0]])
应该返回 “Insufficient Funds”.

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]])
应该返回 “Closed”.

答案:

方法 描述
forEach() 数组每个元素都执行一次回调函数。
push() 向数组的末尾添加一个或更多元素,并返回新的长度。
round() 把数四舍五入为最接近的整数。
parseInt() 解析一个字符串并返回一个整数。
function checkCashRegister(price, cash, cid) {
  var change = cash - price,
      totalCash = 0,
      rArr = [];
  // Here is your change, ma'am.
  cid.forEach(function (arr) {
      totalCash += arr[1];
  });
  if (change > totalCash) {
      return 'Insufficient Funds';
  } else if (change == totalCash) {
      return 'Closed';
  } else {
      for (var i = cid.length - 1; i >= 0; i--) {
          if (cid[i][1] < change) {
              if (cid[i][1] !== 0) {
                  rArr.push(cid[i]);
                  change -= cid[i][1];
              }
              if (cid[i][0] === 'PENNY') {
                  return 'Insufficient Funds';
              }
          } else {
              var t = 0;
              switch (cid[i][0]) {
                  case 'PENNY':
                      t = Math.round(change * 100) * 0.01;
                      rArr.push(['PENNY', t]);
                      change -= t;
                      if (change >= 0.01) {
                          return 'Insufficient Funds';
                      }
                      break;
                  case 'NICKEL':
                      t = parseInt(change / 0.05) * 0.05;
                      if (t > 0) {
                          rArr.push(['NICKEL', t]);
                          change -= t;
                      }
                      break;
                  case 'DIME':
                      t = parseInt(change / 0.1) * 0.1;
                      if (t > 0) {
                          rArr.push(['DIME', t]);
                          change -= t;
                      }
                      break;
                  case 'QUARTER':
                      t = parseInt(change / 0.25) * 0.25;
                      if (t > 0) {
                          rArr.push(['QUARTER', t]);
                          change -= t;
                      }
                      break;
                  case 'ONE':
                      t = parseInt(change / 1) * 1;
                      if (t > 0) {
                          rArr.push(['ONE', t]);
                          change -= t;
                      }
                      break;
                  case 'FIVE':
                      t = parseInt(change / 5) * 5;
                      if (t > 0) {
                          rArr.push(['FIVE', t]);
                          change -= t;
                      }
                      break;
                  case 'TEN':
                      t = parseInt(change / 10) * 10;
                      if (t > 0) {
                          rArr.push(['TEN', t]);
                          change -= t;
                      }
                      break;
                  case 'TWENTY':
                      t = parseInt(change / 20) * 20;
                      if (t > 0) {
                          rArr.push(['TWENTY', t]);
                          change -= t;
                      }
                      break;
                  case 'ONE HUNDRED':
                      t = parseInt(change / 100) * 100;
                      if (t > 0) {
                          rArr.push(['ONE HUNDRED', t]);
                          change -= t;
                      }
                      break;
              }
              if (change === 0) {
                  break;
              }
          }
      }
      return rArr;
  }
}
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.5]]

在线测试:

收银系统算法挑战 | w3cschool

发布了56 篇原创文章 · 获赞 1 · 访问量 835

猜你喜欢

转载自blog.csdn.net/weixin_44790207/article/details/104772859
今日推荐