1. 程式人生 > >W3Cschool高階指令碼演算法(3.收銀系統演算法挑戰)

W3Cschool高階指令碼演算法(3.收銀系統演算法挑戰)

收銀系統演算法挑戰

問題:

設計一個收銀程式 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".

問題答案:

function checkCashRegister(price, cash, cid) {
  var balance = cash - price;
  var change = [];
  var unit = [100.00, 20.00, 10.00, 5.00, 1.00, 0.25, 0.10, 0.05, 0.01];//金額某面值的單位
  //將給出的零錢陣列引數先反轉,然後對映其單位
  var tempCid = cid.reverse().map(function(w,j){
    w.push(unit[j]);
    return w;
  });
  tempCid.forEach(function(v,i,arr){
    if (v[1] > 0 && balance >= v[2]) {
      if (balance >= v[1]) {
        change.push([v[0], v[1]]);
        //js減法的bug,可能會減出迴圈數值,在這裡使用toFixed()方法處理,然後將其轉為數值型別。
        //balance為當前需要找的零錢數
        balance = (balance - v[1]).toFixed(2)  - 0;  
        //當前金額單位的剩餘數值
        v[1] = 0;
      } else {
      //找出當前金額單位可以找零的數值
        var tempMoney = parseInt(balance / v[2]) * v[2];
        change.push([v[0], tempMoney]);
        balance = (balance - tempMoney).toFixed(2) - 0;
        v[1] -= tempMoney;
      }  
    }
  });
  if (balance === 0) {
  //通過判斷零錢陣列成員的第二個值是否為零判斷是否零錢數恰好為該找零的數值。
    if (tempCid.every(function(v){return !v[1];})) {
      return 'Closed';  
    }
    //返回該找零的零錢陣列
    return change;
  } else if (balance > 0) {
    return 'Insufficient Funds';
  } else {
    throw new Error('未知的錯誤');
  }
}

---------------------

本文來自 張子虛 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/ccaoee/article/details/53395329?utm_source=copy 

題目連結: