打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
489,柠檬水找零

Maybe things didn't work out, because there's something better out there for you.

或许有时候会失败,是因为有更好的事在等着你。

问题描述



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

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

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

注意,一开始你手头没有任何零钱。

如果你能给每位顾客正确找零,返回true ,否则返回false 。

示例 1:

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

输出:true

解释:

前 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。

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

 1public boolean lemonadeChange(int[] bills) {
2    //统计店员所拥有的5元和10元的数量(20元的不需要统计,
3    //因为顾客只能使用5元,10元和20元,而20元是没法
4    // 给顾客找零的)
5    int five = 0, ten = 0;
6    for (int bill : bills) {
7        if (bill == 5) {
8            //如果顾客使用的是5元,不用找零,5元数量加1
9            five++;
10        } else if (bill == 10) {
11            //如果顾客使用的是10元,需要找他5元,所以
12            //5元数量减1,10元数量加1
13            five--;
14            ten++;
15        } else if (ten > 0) {
16            //否则顾客使用的只能是20元,顾客使用20元的时候,
17            //如果我们有10元的,要尽量先给他10元的,然后再
18            //给他5元的,所以这里5元和10元数量都要减1
19            ten--;
20            five--;
21        } else {
22            //如果顾客使用的是20元,而店员没有10元的,
23            //就只能给他找3个5元的,所以5元的数量要减3
24            five -= 3;
25        }
26
27        //上面我们找零的时候并没有判断5元的数量,如果5元的
28        //数量小于0,说明上面某一步找零的时候5元的不够了,
29        //也就是说没法给顾客找零,直接返回false即可
30        if (five < 0) {
31            return false;
32        }
33    }
34    return true;
35}

总结



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

486,动态规划解最大子序和

481,用最少数量的箭引爆气球

477,动态规划解按摩师的最长预约时间

464. BFS和DFS解二叉树的所有路径

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
柠檬水你泡对了吗?
在美国,花美元——来具体认识一下美元钱币
有钱能使鬼推磨,来看钱的各种英语表达吧!
回文数的判断
美国每次加印钞票,都要向世界公布:世界各国只能无奈的接受
柠檬水,你泡对了吗?
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服