一、柠檬水找零
题目解析
这道题的核心在于模拟收银过程。每位顾客只能按顺序购买,且柠檬水固定 5 元。我们需要判断在收到不同面额(5、10、20)时,能否正确找零。
需要特别留意的是:
- 初始状态没有现金,如果第一位顾客给的不是 5 元,直接无法找零。
- 必须保证每一位顾客都能被满足,一旦某位无法找零,后续流程无需继续。
- 顾客给出的面额仅限于 5、10、20 三种。
算法原理
这是一个典型的贪心策略问题。当收到 20 元时,优先使用一张 10 元和一张 5 元找零,因为 5 元更通用(可用于找 10 元和 20 元),而 10 元只能用于找 20 元。维护两种面额的库存即可。

代码实现
class Solution {
public boolean lemonadeChange(int[] bills) {
if (bills[0] != 5) {
return false;
}
int five = 0, ten = 0;
for (int bill : bills) {
if (bill == 5) {
five++;
} else if (bill == 10) {
if (five == 0) return false;
five--;
ten++;
} else {
// 收到 20 元,优先消耗 10 元 +5 元
if (ten > 0 && five > 0) {
ten--;
five--;
} (five >= ) {
five -= ;
} {
;
}
}
}
;
}
}


