华为机试题#汽水瓶【代码通俗易懂】

某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)。 小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。 数据范围:输入的正整数满足 1 <= n <= 100

解题思路:

20空水瓶 = 6瓶水(20/3) + 8个空瓶(6瓶水对应的空瓶+兑换汽水剩下的20%3=2个空瓶)

8空瓶 = 2瓶水(8/3) + 4个空瓶(2瓶水对应的空瓶+兑换汽水剩下的8%3=2个空瓶)

4空瓶 = 1瓶水(4/3) + 2个空瓶(1瓶水对应的空瓶+兑换汽水剩下的4%3=1个空瓶)

2空瓶 = 1瓶水 + 0空瓶 --特殊情况,只有剩2空瓶可以想商家借1个空瓶,兑换1瓶汽水,产生的空瓶再还给商家

备注:当剩余空瓶为2时,可以通过借空瓶来兑换1瓶汽水,但是由于借的空瓶必须归还,所以不产生空瓶; 当剩余空瓶为1时,如果向商家借2空瓶兑换1瓶汽水,只能产生1个空瓶,不能偿还商家的2个空瓶。所以当空瓶数小于等于1时,兑换结束。

参考代码如下:


public class Main {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
        while (scanner.hasNextInt()){
            Integer emptyBottle = scanner.nextInt();
            int num = getBottle(0, emptyBottle);
            if(num > 0){
                System.out.println(num); // 可兑换0瓶汽水不打印
            }
        }
	}
    
    /**
     * 递归:叠加每一轮可兑换的汽水数,对每一轮共产生的空瓶进行递归兑换汽水
     * @param bottle 汽水的数量
     * @param emptyBottle 空水瓶数量
     * @return
     */
    public static int getBottle(int bottle, int emptyBottle){
        int rest = 0; // 初始化本轮总共会产生的空瓶子数

        if (emptyBottle <= 1){
            return bottle; // 空汽水瓶数量小于等于1,代表即使问商家借一个空水瓶也换不了一瓶汽水
        }
        if (emptyBottle == 2){
            return bottle+1; // 只剩2个空瓶,借一个空瓶换一瓶汽水,以及喝完剩下的空瓶还给商家就结束了,没有多余的空瓶
        }
        
        int canBeChangedNum = emptyBottle / 3; // 可以兑换的汽水数,也会产生对应个数的空瓶
        int restNum = emptyBottle % 3; // 已有空水瓶兑换汽水后剩下的不能兑换的空瓶子

        // 汇总,加上本轮可兑换的汽水数,以及本轮一共会产生的空瓶数
        bottle += canBeChangedNum;
        rest += canBeChangedNum;
        rest += restNum;
        return getBottle(bottle, rest);
    }
}