codecamp

收银系统算法挑战

方法一:

function checkCashRegister(price, cash, cid) {
  var change=[];   //储存结果
  var cid_obj={    //存储值和数量
    "ONE HUNDRED":{val:100},
    "TWENTY":{val:20},
    "TEN":{val:10},
    "FIVE":{val:5},
    "ONE":{val:1},
    "QUARTER":{val:0.25},
    "DIME":{val:0.1},
    "NICKEL":{val:0.05},
    "PENNY":{val:0.01}  
  };


  for(var a of cid){
    cid_obj[a[0]].num=Math.ceil(a[1]/cid_obj[a[0]].val); //更新不同货币的数量
  }

  
  if( price==cash ){
    return "Closed";
  }else{
    var cha=cash-price;  //需要找零的钱
    for(let k of Object.keys(cid_obj)){
      var count=0;
      while( cha>=cid_obj[k].val && cid_obj[k].num!==0 ){ //没有完成找零且当前零钱可以找零
          cha=(cha-cid_obj[k].val).toFixed(2); //这里需要四舍五入成2位小数,不然会有计算误差
          cid_obj[k].num--;
          count++;
          if( cid_obj[k].num===0 || cha<cid_obj[k].val ){   //如果没零钱了
            change.push([k,cid_obj[k].val*count]);
            break;
          }

          
      }
    }


    if( cha==0 ){
      if( cid_obj["PENNY"].num==0 ){
        return "Closed";
      }
      return change;
    }else{
      return "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]]);

方法二:

 function checkCashRegister(price, cash, cid) {
        var change = cash - price,
            totalCash = 0,
            rArr = [],
            isDone = false;
        // 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;
        }
    }


// Example cash-in-drawer array:
// [["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", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY"]);
集合交集算法挑战
库存更新算法挑战
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定