【每日一题】柠檬水找零

地址

leetcode地址:

https://leetcode.cn/problems/lemonade-change/description/?envType=study-plan-v2&envId=programming-skills

难度

简单

题目

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

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

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

给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。

示例 1:

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

输出:true

解释: 

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

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

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

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

示例 2:

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

输出:false

解释:

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

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

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

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

提示:

  • 1 <= bills.length <= 10^5
  • bills[i] 不是 5 就是 10 或是 20

思路

由题意可以知道bills中的数只有5,10,20这三个数值。

收取5元,由于售价为5元,则5元直接收入,无需其他操作

收取10元,售价为5元,则需要找给顾客5元,即10元的数量+1,5元的数量-1。如果5元的数量不大于0,则找零失败。

收取20元,售价为5元,则需要找给顾客20元,此时有两种情况:

  • 有10元的情况,则就是10元的数量-1,5元的数量-1;如果5元和10元的数量不大于0,则找零失败。

  • 无10元的情况,则就是5元的数量-3;如果5元的数量不大于3,则找零失败。

class Solution {
    public boolean lemonadeChange(int[] bills) {
        int five = 0;
        int ten = 0;
        for (int i = 0; i < bills.length; i++) {
            if (bills[i] == 5) {
                five++;
            }else if (bills[i] == 10) {
                ten++;
                five--;
                if (five < 0) {
                    return false;
                }
            }else {
                if (ten > 0 && five >0) {
                    ten--;
                    five--;
                } else if (five >= 3) {
                    five = five - 3;
                }else{
                    return false;
                }
            }
        }
        return true;
    }
}

:+1:

写的比较丑陋-。-

def bills(bills: list):
    old_bills = [h for h in bills]
    my_bills=[]
    for i in range(len(old_bills)):
        if old_bills[i]==5:
            my_bills.append(old_bills[i])
            bills.pop(0)
            if bills == []:
                return True
            else:
                continue
        elif old_bills[i]==10:
            for j in range(len(my_bills)):
                if my_bills[j]==5:
                    my_bills.pop(j)
                    my_bills.append(old_bills[i])
                    bills.pop(0)
                    if bills == []:
                        return True
                else:
                    return False
        elif old_bills[i]==20:
            for k in range(len(my_bills)):
                if my_bills[k]==10:
                    my_bills.pop(k)
                    for l in range(len(my_bills)):
                        if my_bills[l]==5:
                            my_bills.pop(l)
                            my_bills.append(old_bills[i])
                            bills.pop(0)
                            if bills == []:
                                return True
                        else:
                            return False
                elif my_bills[k]==5:
                    my_bills.pop(k)
                    for m in range(len(my_bills)):
                        if my_bills[m]==10:
                            my_bills.pop(m)
                            my_bills.append(old_bills[i])
                            bills.pop(0)
                            if bills == []:
                                return True
                        elif my_bills[m]==5:
                            my_bills.pop(m)
                            for n in range(len(my_bills)):
                                if my_bills[n]==5:
                                    my_bills.pop(n)
                                    my_bills.append(old_bills[i])
                                    bills.pop(0)
                                    if bills == []:
                                        return True
                                else:
                                    return False
                        else:
                            return False
                else:
                    return False

assert bills([5,5,5,10,20])==True
assert bills([5,5,10,10,20])==False