力扣1518. 换水问题

题目链接

力扣1518. 换水问题

简单方法(模拟)

思路

对换水进行模拟,每次喝完 n u m E x c h a n g e numExchange numExchange 瓶水后就去换一瓶水,直到不能再兑换为止,也就是剩余水的数量小于 n u m E x c h a n g e numExchange numExchange时,不再模拟。故可以得出以下的代码:

代码

class Solution {
    public int numWaterBottles(int numBottles, int numExchange) {
        int emptyBottles = 0;							// 用来兑换的空水瓶的总数
        while (numBottles >= numExchange) {
            numBottles = numBottles - numExchange + 1;	// 用numExchange个空水瓶兑换一瓶水
            emptyBottles += numExchange;				// 用来兑换的空水瓶数 += 本轮循环兑换的空水瓶数
        }
        return emptyBottles + numBottles;				// 此时的numBottles为剩余的无法兑换的水
    }
}

简单方法的优化

思路

先对简单方法进行分析,费时的操作在哪里?

可以看到,换水的次数太多了,所以要减少换水的次数。

怎样减少换水的次数?

换水时直接将所有水先喝完,最大化本次换水的瓶数。设用来兑换一瓶水的瓶数为 n n n、本次的总空瓶数为 m m m、本次兑换的水瓶数为 a a a、本次用来兑换的空瓶数为 e e e,则有这样的关系式 a = m / n , e = a ∗ n a = m / n, e = a * n a=m/n,e=an,并且 a a a 要向下取整。

代码

class Solution {
    public int numWaterBottles(int numBottles, int numExchange) {
        int emptyBottles = 0;							// 用来兑换的空水瓶的总数
        while (numBottles >= numExchange) {
            int addition = numBottles / numExchange;	// 用numExchange个空水瓶兑换最多瓶水的瓶数
            numBottles %= numExchange;					// 最大化本次换水的数量
            numBottles += addition;						// 让总水瓶数加上本次换的水瓶数
            emptyBottles += addition * numExchange;		// 用来兑换的空水瓶的总数 += 本次用来兑换的空瓶数
        }
        return emptyBottles + numBottles;				// 此时的numBottles为剩余的无法兑换的水
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值