算法_柠檬水找零(#860)

112 阅读2分钟

题目

就是柠檬水售价为5美元,顾客给的钱有5美元,10美元,20美元,必须给每位顾客找零,能全部找零返回true,否则返回false;

image.png

分析一波

给的是数组,所以可设置循环去遍历每次顾客给的钱;
分3种情况:
第一种如果此次顾客给的是5美元,那么5美元零钱加一次,就退出本次循环;
如果是10美元,先看看有没有5美元,没有就是找不开,返回false,退出循环,
否则,5美元的数量减1,10美元的数量加1; 如果是20美元:
看看有没有10美元和5美元,有的话就5美元的数量减1,10美元的数量也减1;
否则再看看有没有3张5美元,有的话就5美元数量减3,
否则就返回false ,找不开;

上代码分析

/**
 * @param {number[]} bills
 * @return {boolean}
 */
var lemonadeChange = function(bills) {   
    let cnt5=0,cnt10=0; 
    for(var i=0;i<bills.length;i++){
      switch(bills[i]){
          case 5:  
          cnt5++;  
          break;  
          case 10: {
            if(!cnt5) return false;    
             cnt5--;  
             cnt10++;
          } 
          break;
            
          case 20:{
              if(cnt5&&cnt10){
                  cnt5--;  
                  cnt10--;  
              }else if(cnt5>2){
               cnt5-=3;
              }else{
                  return false
              }
          }
          break;

      }
    }
    return true;

};

因为5美元,10美元,20美元买5美元的柠檬水找零的话,只会找5美元和10美元的,
所以:
定义两个变量5美元和10美元,去存他两的数量;
首先使用for循环去遍历给的数组:
然后使用switch,在里面去进行不同情况下的判断:
如果是5美元的话:
不用找零,5美元数量加1,然后退出;
如果是10美元的话:
因为找零的话,找1张5美元就可以了,
先判断有没有5美元,没有就找证明找不开,直接返回false退出,不用再判断后面的了;
否则有5美元,那么5美元数量减1,退出此次操作,再开始下一次循环;
如果是20美元的话:
那么有两种情况可找零:

1.找1张10美元和一张5美元就可;
2.找3张5美元也可以;

因此:
判断是否有10美元和5美元,
有的话,10美元和5美元数量各减1;
否则判断是否有3张5美元,
有的话5美元数量减掉3;
否则,就是找不开,直接返回false;