数据结构与算法之栈: LeetCode 3100. 换水问题 II (Ts版)
换水问题 II
-
给你两个整数 numBottles 和 numExchange 。
-
numBottles 代表你最初拥有的满水瓶数量。在一次操作中,你可以执行以下操作之一:
- 喝掉任意数量的满水瓶,使它们变成空水瓶。
- 用 numExchange 个空水瓶交换一个满水瓶。然后,将 numExchange 的值增加 1 。
-
注意,你不能使用相同的 numExchange 值交换多批空水瓶。例如,如果 numBottles == 3 并且 numExchange == 1 ,则不能用 3 个空水瓶交换成 3 个满水瓶。
-
返回你 最多 可以喝到多少瓶水。
示例 1
输入:numBottles = 13, numExchange = 6
输出:15
解释:上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值,以及累计喝掉的水瓶数量
示例 2
输入:numBottles = 10, numExchange = 3
输出:13
解释:上表显示了满水瓶的数量、空水瓶的数量、numExchange 的值,以及累计喝掉的水瓶数量。
提示
- 1 <= numBottles <= 100
- 1 <= numExchange <= 100
Typescript 版算法实现
1 ) 方案1
function maxBottlesDrunk(numBottles: number, numExchange: number): number {
let total = numBottles;
while (numBottles >= numExchange) {
// 每次喝完一瓶水后,会剩下一个空瓶,用空瓶交换新的水瓶
numBottles += 1 - numExchange++;
total++;
}
return total;
};
2 ) 方案2
function maxBottlesDrunk(numBottles: number, numExchange: number): number {
let result = 0;
// 空瓶子数量
let emptyBottles = 0;
// 标识:如果还有喝水/换水操作就继续再执行一次,直到无操作结束
let flag = true;
while (flag) {
flag = false;
// 喝水
if (numBottles > 0) {
result += numBottles;
emptyBottles += numBottles;
numBottles = 0;
flag = true;
}
// 换水
if (emptyBottles >= numExchange) {
numBottles++;
emptyBottles -= numExchange;
numExchange++;
flag = true;
}
}
return result;
}