Exact Change(FCC高级算法)

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

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

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

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

 

重点:

  两位小数的减法运算会出错(用谷歌调试的时候发现的),所以我把所有数值都扩大了100倍计算

function checkCashRegister(price, cash, cid) {
  var nums = [10000, 2000, 1000, 500, 100, 25, 10, 5, 1]; 
  var num = cash*100 - price*100;
  cid = cid.reverse();
  var arr = new Array();
  for(i=0; i<10 ;i++){
    arr[i] = new Array();
  }
  var j = 0;
  var sum = 0;
  var bool = false;
  nums.forEach( function(element, index) {
    // statements
        sum=0;
        while(num >= element){
          //下面这段代码时为了加快计算的
          var cid1 = cid[index][1]*100;
          if( cid1>= element){
            if(num >= cid1){
              num -= cid1;
              sum +=cid1;
              cid[index][1] -= cid1/100;
            }else {
              num -= element;
              sum +=element;
              cid[index][1] -= element/100;
            }
         bool = true;
         arr[j][0] = cid[index][0];
         arr[j][1] = sum/100;
      } else {
        break;
      }
    }
    if(bool){
          j++;
          bool = false;
        }
  });
  //删除掉多余的数组项
  for (var i = 0; i < arr.length; i++) {
    if(arr[i] == ""){
      arr.splice(i,1);
      i--;
    }
  }
  // 计算结束如果num还是>0则表示钱不够找0
  if(num > 0)return "Insufficient Funds";
  //在num=0的基础上  如果钱柜所有钱都找零用完了   
  if( cid.every(function(a,b,c){
      return a[1] === 0;
  })) return "Closed";
  //在钱柜还有钱  num0 的基础上  返回找零出去的信息
  return arr;
}

 

posted on 2018-01-11 12:03  辣条菌的思维屋i  阅读(195)  评论(0编辑  收藏  举报