⛅(day12)
目录
🖍题目:
题目分析:
解题思路:
🌈递归解法:
🌈数学解法:
🖍题目:
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。请你计算 最多 能喝到多少瓶酒。
🌠示例 1:
输入:numBottles = 9, numExchange = 3
输出:13
原由:你可以用 3 个空酒瓶兑换 1 瓶酒。
所以最多能喝到 9 + 3 + 1 = 13 瓶酒。
🌠示例 2:
输入:numBottles = 15, numExchange = 4
输出:19
原由:你可以用 4 个空酒瓶兑换 1 瓶酒。
所以最多能喝到 15 + 3 + 1 = 19 瓶酒。
🌠示例 3:
输入:numBottles = 5, numExchange = 5
输出:6
🌠示例 4:
输入:numBottles = 2, numExchange = 3
输出:2
题目分析:
当你买入numBottles瓶酒,那么你肯定能喝到numBottles瓶,接下来就要将喝完的numExchange个空瓶子换一瓶新酒,不断重复。
解题思路:
1.将所买的酒记录到喝完的酒中,已喝的酒的瓶数用all表示
2.接着计算喝剩的空酒瓶最多能换多少瓶酒
3.将换到的酒记录到已喝的酒all当中
循环这一过程
代码实现
🌈递归解法:
def numWaterBottles(numBottles, numExchange):
all = 0
all += numBottles
i = numBottles // numExchange # 整除
all += i
j = numBottles % numExchange # 求余
if numBottles < numExchange:
return numBottles
else:
while i + j >= numExchange:
i, j = (i + j) // numExchange, (i + j) % numExchange
all += i
return all
值得注意的是:while循环下 i 和 j 要同时负值,像上面的代码一样并列写
如果这样赋值
i = (i + j) // numExchange
j = (i + j) % numExchange
则会出错,因为 i 赋值后会影响下一个 j 的赋值结果
✨ 可以优化一下
def numWaterBottles(numBottles, numExchange):
all = numBottles
while numBottles >= numExchange:
all += numBottles // numExchange
numBottles = numBottles // numExchange + numBottles % numExchange
return all
把all的默认值设为numBottles,这样就可以省略 if 语句
numBottles = numBottles // numExchange + numBottles % numExchange等同于 i+j
🌈数学解法:
现在我们假设买进a瓶酒,换一瓶酒需要b个酒瓶。在我们都把酒喝完的情况下,每换一次损失的空酒杯为b - 1,(换一次消耗b个,但是得到一瓶新的,所以为b - 1),那么每换一次我们就可以地到一瓶新酒。
因为我们买进a瓶所以肯定可以喝a瓶
那么我们能换多少次?
🌻1.当a >= b
当剩余的酒瓶数< b时就不能换了
那么有 a - n(b - 1)>= b
现在求最多能换的次数n,即求最小的n使得
a - n(b - 1)< b
====>n = (a - b)/ (b - 1) + 1
可以喝的最大瓶数 all = (a - b)/ (b - 1) + 1 + a
🌻2.当 a < b时
我们没足够的酒瓶可换
all = a
代码实现
def numWaterBottles(numBottles, numExchange):
return (numBottles - numExchange) // (numExchange - 1) + 1 + numBottles if numBottles >= numExchange else numBottles