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:
        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

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

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

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亖夕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值