489,柠檬水找零

在这里插入图片描述

想看更多算法题,可以扫描上方二维码关注我微信公众号“数据结构和算法”,截止到目前我已经在公众号中更新了500多道算法题,其中部分已经整理成了pdf文档,截止到目前总共有800多页(并且还会不断的增加),可以在公众号中回复关键字“pdf”即可下载。


问题描述

在柠檬水摊上,每一杯柠檬水的售价为5美元。

顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。


注意,一开始你手头没有任何零钱。
如果你能给每位顾客正确找零,返回true ,否则返回false 。


示例 1:

输入:[5,5,5,10,20]

输出:true

解释

扫描二维码关注公众号,回复: 12701151 查看本文章

前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。

第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。

第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。

由于所有客户都得到了正确的找零,所以我们输出 true。

示例 2:

输入:[5,5,10]

输出:true

示例 3:

输入:[10,10]

输出:false

示例 4:

输入:[5,5,10,10,20]

输出:false

解释

前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。

对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。

对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。

由于不是每位顾客都得到了正确的找零,所以答案是 false。


提示:

  • 0 <= bills.length <= 10000

  • bills[i]不是5就是10或是20


问题分析

这道题算是生活中很常见的一道题,对于每一个顾客如果我们都有足够的零钱给他找零,那么就返回true,只要有一个顾客没有足够的零钱找给他就返回false。


顾客只能有3种纸币 ,5元,10元,20元。我们要统计5元和10元的数量,20元的不需要统计,因为20元没法找给别人。


  • 顾客给5元,5元的数量加1

  • 顾客给10元,5元的数量减1(减完之后再判断5元的数量,如果小于0,说明5元的不够了,没法给顾客找零了,直接返回false)

  • 顾客给20元,根据生活常识,如果有10元的,应该先找他10元的,然后再找他一个5元的。如果没有10元的就找他3个5元的,然后再判断5元的数量,如果小于0直接返回false。

原理比较简单,我们来看下代码

public boolean lemonadeChange(int[] bills) {
    
    
    //统计店员所拥有的5元和10元的数量(20元的不需要统计,
    //因为顾客只能使用5元,10元和20元,而20元是没法
    // 给顾客找零的)
    int five = 0, ten = 0;
    for (int bill : bills) {
    
    
        if (bill == 5) {
    
    
            //如果顾客使用的是5元,不用找零,5元数量加1
            five++;
        } else if (bill == 10) {
    
    
            //如果顾客使用的是10元,需要找他5元,所以
            //5元数量减1,10元数量加1
            five--;
            ten++;
        } else if (ten > 0) {
    
    
            //否则顾客使用的只能是20元,顾客使用20元的时候,
            //如果我们有10元的,要尽量先给他10元的,然后再
            //给他5元的,所以这里5元和10元数量都要减1
            ten--;
            five--;
        } else {
    
    
            //如果顾客使用的是20元,而店员没有10元的,
            //就只能给他找3个5元的,所以5元的数量要减3
            five -= 3;
        }

        //上面我们找零的时候并没有判断5元的数量,如果5元的
        //数量小于0,说明上面某一步找零的时候5元的不够了,
        //也就是说没法给顾客找零,直接返回false即可
        if (five < 0) {
    
    
            return false;
        }
    }
    return true;
}

总结

一道生活常识问题,找零的时候我们并没有先判断5元的数量,而找完之后再判断5元的数量是否是大于0还是小于0。如果在找零的时候先判断5元的数量也是可以的,只不过稍微有一点点麻烦,因为顾客只要给的不是5元的都要先判断。

猜你喜欢

转载自blog.csdn.net/abcdef314159/article/details/112298760