柠檬水找零
要求
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。
注意,一开始你手头没有任何零钱。
给你一个整数数组 bills ,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/le… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
一开始我们没有钱的,当顾客拿着钱来买水时,我们只需要找10块,找5块,或者不找钱,所以我们定义两个数(钱箱)用来储存钱的张数let five = 0,ten = 0;,并不需要创建二十元钱箱,对找零没用处。
当顾客拿着五块钱过来:
- 我们的五元钱箱
five += 1
当顾客拿着十块钱过来:
-
当我们的五元钱箱为空时,返回false,
-
当我们的五元钱箱不为空时,我们的五元钱箱
five -= 1,然后十元钱箱ten += 1
当顾客拿着二十块过来:
-
当我们的十元钱箱不为空且五元钱箱不为空时,五元钱箱
five -= 1,十元钱箱ten -= 1,不然返回false -
当我们的十元钱箱为空时,五元钱箱必须有三张钱以上
five > 2才够找零:five -= 3,不然返回false
代码
var lemonadeChange = function (bills) {
// 创建5元,10元钱箱,用来记录钱的张数
let five = 0,
ten = 0;
for (let i = 0; i < bills.length; i++) {
if (bills[i] == 5) {
// 当顾客拿5块钱过来,5元钱箱+=1
five += 1;
} else if (bills[i] == 10) {
// 当顾客拿10块钱过来,当我们5元钱箱有钱,-=1,没钱就返回false
if (five > 0) {
five -= 1;
ten += 1;
} else {
return false;
}
} else {
// 当顾客拿20块钱过来
if (ten > 0 && five > 0) {
// 当我们10元钱箱有钱,且5元钱箱有钱,各-=1
ten -= 1;
five -= 1;
} else if (five > 2) {
// 当10元钱箱没钱,只能去5元钱箱找,5元钱箱大于2(3以上),-= 3
five -= 3;
} else {
// 5元钱箱的钱的张数不大于2(3或以上),不够找,返回false
return false
}
}
}
return true;
};
另一种写法
var lemonadeChange = function (bills) {
// 创建5元,10元钱箱,用来记录钱的张数
let five = 0,
ten = 0;
for (const bill of bills) {
if (bill == 5) five += 1;
if (bill == 10) {
five -= 1;
ten += 1;
}
if (bill == 20) {
if (ten > 0) {
ten -= 1;
five -= 1;
} else {
five -= 3;
}
}
if (five < 0 || ten < 0) return false;
}
return true;
};