> 文档中心 > Python每日一练-----换酒问题

Python每日一练-----换酒问题

(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:     i, j = (i + j) // numExchange, (i + j) % numExchange     all += i    return all

值得注意的是:while循环下  i  和  j  要同时负值,像上面的代码一样并列写

如果这样赋值

i = (i + j) // numExchangej = (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

今天就到这,明天见。🐱‍🏍

❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄end❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄❄