[Advanced Algorithm] - Exact Change

題目

設計一個收銀程序 checkCashRegister(),其把購買價格(price)做爲第一個參數 , 付款金額 (cash)做爲第二個參數, 和收銀機中零錢 (cid) 做爲第三個參數.數組

cid 是一個二維數組,存着當前可用的找零.測試

當收銀機中的錢不夠找零時返回字符串 "Insufficient Funds". 若是正好則返回字符串 "Closed".設計

不然, 返回應找回的零錢列表,且由大到小存在二維數組中.code

提示

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

分析思路

這個就是平時的自動找零機須要作的代碼。主要是要構建現金面值數組,從大到小找零便可,具體分析見代碼註釋。ip

代碼

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;
}
相關文章
相關標籤/搜索