提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
目录
前言
一、问题描述
二、解法分析
总结
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、问题描述
在柠檬水摊上,每一杯柠檬水的售价为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);
}
总结
没啥难度,简单到有手就行!