描述
有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
输入描述:
输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。
输出描述:
对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。
示例1
输入
3
10
81
0
输出
1
5
40
解法
我一开始的想法是这样的:此题考察对3取模后余数的处理。这里需要注意如果空瓶余数是2,则也可以兑换1瓶子;兑换的汽水最终也是会产生相应的空瓶。因此,每次兑换汽水的计算会产生新的空瓶结果,因此采用递归方式来写。
但是后面,转头一想,既然每2空瓶就能换一瓶,为啥还用3个空瓶去换?也就是说,只要能够2个空瓶,就能喝到1瓶汽水。所以,题目的结果就是 n/2了。这题就 有点脑筋急转弯了。
/* * Copyright (c) waylau.com, 2022. All rights reserved. */ package com.waylau.nowcoder.exam.oj.huawei; import java.util.Scanner; /** * HJ22 汽水瓶. * 描述:有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。 * 小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶, * 方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子, * 用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水, * 喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。 * 如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? * 输入描述:输入文件最多包含10组测试数据,每个数据占一行, * 仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。 * n=0表示输入结束,你的程序不应当处理这一行。 * 输出描述:对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。 * * @author <a href="https://waylau.com">Way Lau</a> * @since 2022-08-15 */ public class HJ022SodaBottle { public static void main(String[] args) { // 输入 Scanner sc = new Scanner(System.in); // in为0则退出程序 while (sc.hasNext()) { int in = sc.nextInt(); if (in == 0) { break; } int result = getBottles(in); // 输出 System.out.println(result); } // 关闭 sc.close(); } private static int getBottles(int empty) { // 边界,余数小于2则没法再兑换了 if (empty < 2) { return 0; } // 取倍数,作为兑换汽水数 int j = empty / 2; return j; } }
参考引用
- 本系列归档至https://github.com/waylau/nowcoder-exam-oj
- 《Java 数据结构及算法实战》:https://github.com/waylau/java-data-structures-and-algorithms-in-action
- 《数据结构和算法基础(Java 语言实现)》(柳伟卫著,北京大学出版社出版):https://item.jd.com/13014179.html