405,换酒问题

想了解更多数据结构以及算法题,可以关注微信公众号“数据结构和算法”,每天一题为你精彩解答。也可以扫描下面的二维码关注
在这里插入图片描述

小区便利店正在促销,用 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


提示:

  • 1 <= numBottles <= 100
  • 2 <= numExchange <= 100

问题分析

类似这种题估计很多人都见过,一般是作为一道脑筋急转弯的题出现,我们就以示例4为例来说下,如果3个空瓶子可以换一瓶酒的话,我们只有两瓶酒,喝完之后最多只有两个空瓶子,所以是换不成一瓶酒的。但如果我们找别人借一个空瓶子的话,正好是3个空瓶子,可以换一瓶酒,喝完之后再把这个空瓶子还给别人,所以我们可以喝3瓶酒,作为一道脑筋急转弯题这是正确的,但这道题答案返回的是2,也就是说我们不能找别人借。


我们假设一个空瓶子的价值是1,那么一瓶酒(不包含瓶子)的价值就是numExchange-1。我们最初所拥有的总价值就是numBottles* numExchange,因为不能找别人借,所以最后我们至少会有一个空瓶子,也就是说最后我们所能喝到的最大价值<=numBottles* numExchange-1,我们能喝的到酒的数量就很容易算出来了。

public int numWaterBottles(int numBottles, int numExchange) {
    return (numBottles * numExchange - 1) / (numExchange - 1);
}

另一种解法

每次喝完之后如果空瓶子数量大于等于numExchange,我们就把他兑换成酒,这个时候我们所拥有的瓶子数量就是我们兑换成酒的瓶子数量加上没有兑换成酒的瓶子数量,如果还大于numExchange就继续循环……,直到不能兑换为止。

public int numWaterBottles(int numBottles, int numExchange) {
    int total = numBottles;
    while (numBottles >= numExchange) {
        //change表示的是兑换成酒的数量
        int change = numBottles / numExchange;
        //total再加上兑换的酒
        total += change;
        //瓶子数量变为兑换成酒的数量加上没有兑换成酒的数量
        numBottles = change + numBottles % numExchange;
    }
    return total;
}

总结

这道题和脑筋急转弯题型还是有点区别的,如果空瓶子数量不够的情况下我们是不能借的,这两种解法都比较简单。


在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

数据结构和算法

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

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

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

打赏作者

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

抵扣说明:

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

余额充值