860.柠檬水找零
860.1 题目
在柠檬水摊上,每一杯柠檬水的售价为 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
860.2 题解
模拟收银过程
// 方法一:模拟收银过程
// 遍历现金数组,记录5美元和10没有的数量
static bool LemonadeChange1(int[] bills)
{
// 维护 5 美元和 10 美元零钱的数量
int count5 = 0;
int count10 = 0;
// 遍历账单数组
foreach (int bill in bills)
{
if (bill == 5)
{
// 收到 5 美元,无需找零
count5++;
}
else if (bill == 10)
{
// 收到 10 美元,找零 5 美元
count10++;
count5--;
}
else if (bill == 20)
{
if (count10 > 0)
{
// 收到 20 美元,优先找零一张 10 美元和一张 5 美元
count10--;
count5--;
}
else
{
// 收到 20 美元,找零三张 5 美元
count5 -= 3;
}
}
// 若 5 美元零钱数量小于 0,则找零失败
if (count5 < 0 || count10 < 0)
return false;
}
// 若全部账单完成后没有找零失败,则找零成功
return true;
}
860.3 代码
using System;
using System.Collections.Generic;
class Program
{
static void Main()
{
#region 题目
// 在柠檬水摊上,每一杯柠檬水的售价为 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 <= 105
// bills[i] 不是 5 就是 10 或是 20
#endregion
#region 测试
// 示例 1
int[] bills1 = { 5, 5, 5, 10, 20 };
bool result1_1 = LemonadeChange1(bills1);
Console.WriteLine($"示例1 方法1 输出:{result1_1}");
// 示例 2
int[] bills2 = { 5, 5, 10, 10, 20 };
bool result2_1 = LemonadeChange1(bills2);
Console.WriteLine($"示例2 方法1 输出:{result2_1}");
#endregion
}
#region 答案
// 方法一:模拟收银过程
// 遍历现金数组,记录5美元和10没有的数量
static bool LemonadeChange1(int[] bills)
{
// 维护 5 美元和 10 美元零钱的数量
int count5 = 0;
int count10 = 0;
// 遍历账单数组
foreach (int bill in bills)
{
if (bill == 5)
{
// 收到 5 美元,无需找零
count5++;
}
else if (bill == 10)
{
// 收到 10 美元,找零 5 美元
count10++;
count5--;
}
else if (bill == 20)
{
if (count10 > 0)
{
// 收到 20 美元,优先找零一张 10 美元和一张 5 美元
count10--;
count5--;
}
else
{
// 收到 20 美元,找零三张 5 美元
count5 -= 3;
}
}
// 若 5 美元零钱数量小于 0,则找零失败
if (count5 < 0 || count10 < 0)
return false;
}
// 若全部账单完成后没有找零失败,则找零成功
return true;
}
#endregion
}
860.4 运行结果
示例1 方法1 输出:True
示例2 方法1 输出:False
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com