算法:柠檬水找零

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

目录

前言

一、问题描述

二、解法分析

总结


前言

提示:这里可以添加本文要记录的大概内容:

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。


提示:以下是本篇文章正文内容,下面案例可供参考

一、问题描述

在柠檬水摊上,每一杯柠檬水的售价为5美元。
顾客排队购买你的产品,(按账单bills支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付5美元、10美元或20美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付5美元。

输入:[5,5,5,10,20]
输出:true
解释:
前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
由于所有客户都得到了正确的找零,所以我们输出 true。

输入:[5,5,10]
输出:true

输入:[10,10]
输出:false

输入:[5,5,10,10,20]
输出:false
解释:
前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
由于不是每位顾客都得到了正确的找零,所以答案是 false。

二、解法分析

解题思路:

当遇到5时,直接收下

当遇到10时,需要收下,并支出一个5

当遇到20时,需要收下,并支出10+5或者5+5+5

那么整个过程中,需要关注的就是10和5的已经收下的数量

需要两个计数器,分别记录当前有几个5,几个10

收入就意味着计数器+1,支出就意味着计数器-1,当收下的面额是20且10的数量是0是,支出的5的数量一次是3,这个要注意。

代码示例:

public void 找零test() {
    int[] a = {5,5,10,10,20};
    // a5: 记录已收下的5的数量, 初始值为0; a10同理
    int a5 = 0, a10 = 0;
    // 如果首个元素比5大, 则第一个就找不开
    if (a[0] > 5) {
        System.out.println(false);
        return;
    }
    for (int i : a) {
        // 此处是当循环没有结束时, 对上一轮过后结果进行判断, 如果5或者10透支了, 则判定为失败
        if (a5 < 0 || a10 < 0) {
            System.out.println(false);
            return;
        }
        // 当本次要收下的是5时, a5计数器+1, 继续下一轮
        if (i == 5) {
            a5++;
            continue;
        }
        // 当本次要收下的是10时, a5计数器-1, a10计数器+1, 继续下一轮
        if (i == 10) {
            a5--;
            a10++;
            continue;
        }
        // 当本次要收下的是20且已收下的10大于等于1张, 优先支出1张10, a10计数器-1, a5计数器-1, 继续下一轮
        if (a10 > 0) {
            a10--;
            a5--;
            continue;
        }
        // 当本次要收下的是20且已收下的10小于1张, 支出3张5, 继续下一轮
        a5 = a5 - 3;
    }
    // 此处用来对最后一轮过后, 是否透支10或者5进行校验, 任何一个透支则为失败
    if (a5 < 0 || a10 < 0) {
        System.out.println(false);
        return;
    }
    // 没有被以上任何一种失败的命中, 则最终成功
    System.out.println(true);
}


总结

没啥难度,简单到有手就行!

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值