FCC(ES6寫法) Exact Change

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

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

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

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

 

思路:數組

1.remainder表示剩餘要找的錢,arr裏放須要的零錢數組,value表示總共要找的錢的總值。這裏要分清value總值和total總值。app

2.用循環計算出數組裏的錢,用total來表示零錢總值,要明白cid[i][1]存放的是該零錢的價值,就很好理解了,第一層循環條件同時保證該零錢有值,且找到知足要找錢的最大數組的值。優化

3.在循環中由於從大到小,就只要考慮,c表示能夠找的最大零錢的個數,若是要找的錢大於了當前已有最大數組的值,則相減後,把當前數組放入arr[j]並讓j自加,若是小於,就減掉當前數組最多能減掉的值並把將當前零錢的價值寫給數組,最後把它賦給arr[j]。由於減法運算可能會形成浮點不許確,因此要每次循環都添加toFixed保留兩位小數。設計

4.最後把判斷return的語句添上,要注意第二個判斷必須是!=,不能用!==,有可能remainder爲0.00的狀況,而這種狀況也不能用parseInt去取正。code

 

let checkCashRegister = (price, cash, cid) => {
  let remainder = cash - price,arr = [],j = 0,total = 0 ,value = remainder;
  const array = [0.01,0.05,0.1,0.25,1,5,10,20,100];
  for(let i = cid.length - 1;i >= 0;i--){
    total += cid[i][1];
    if(remainder > array[i] && cid[i][1] > 0){
      let c = parseInt(remainder / array[i]);
      if(remainder > cid[i][1]){
        remainder -= cid[i][1];
      }else{
        remainder -= c * array[i];
        cid[i][1] = c * array[i];
      }
      remainder = remainder.toFixed(2);
      arr[j++] = cid[i];
    }   
  }
  if(total === value){
    return "Closed";
  }else if(total < value || remainder != 0){
    return "Insufficient Funds";
  }
  return arr;
};
console.log(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]]

  

  

若是有不明白的地方請留言,若是有更好更簡便更優化的方法請留言,謝謝。blog

 

更多內容請訪問個人我的博客: Bblog

相關文章
相關標籤/搜索