java 面试上机题_今天面试的上机题。你会几个?

该博客介绍了一个Java程序,用于模拟可乐瓶换瓶过程,并使用穷举法计算购买一定数量可乐所需的最少瓶子数。程序包含`changeOne()`方法来执行换瓶操作,以及`changeAll()`方法进行多次交换直到无法再换。还提供了`countNeedBuyNumber()`方法计算初始购买瓶数,以满足指定人数的需求。博客通过一系列测试用例展示了算法的正确性。
摘要由CSDN通过智能技术生成

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

public class ChangingTest { private int count = 0; // 喝过的总数 private int empty = 0; // 剩下还没换的空瓶 // /** // * 换一次 [老的错误代码] // */ // private void changeOne() { // count += empty / 5; // empty = empty % 5; // 没有将目前换到的瓶数 计入 空瓶数内 // } /** * 换一次 */ private void changeOne() { int changed = empty / 5; // 表示目前用所有的空瓶换到的瓶数 count += changed; empty = changed + (empty % 5); // 目前换到的瓶数 + 目前还不够拿去换的瓶数 } /** * 初始initEmpty空瓶数, 一直交换后, 得到一共能喝到的可乐总数 */ public int changeAll(int initEmpty) { this.empty = initEmpty; this.count = initEmpty; while (empty >= 5) { this.changeOne(); } return count; } /** * 计算需要购买的瓶数 * @param personNumber 总人数 */ public int countNeedBuyNumber(int personNumber) { // 穷举到底需要买几瓶可以买满number数. int i = this.getStartNumber(personNumber); int j = 0; // 穷举次数 boolean isOk = false; while (!isOk) { j++; int total = this.changeAll(i); if (total >= personNumber) { isOk = true; break; } else { i++; // ++再穷举 } } System.out.println("----------------"); System.out.println("总人数: " + personNumber); System.out.println("需要购买: " + i); System.out.println("穷举次数: " + j); return i; } /** * 计算开始穷举的瓶数 * @param personNumber 总人数 */ private int getStartNumber(int personNumber) { if (personNumber <= 5) { return personNumber; } else { return personNumber - personNumber / 5; } } public static void main(String[] args) throws Exception { ChangingTest test = new ChangingTest(); assertEqual(test.countNeedBuyNumber(4), 4); // 4个人买4瓶 assertEqual(test.countNeedBuyNumber(5), 5); // 5个人买5瓶 assertEqual(test.countNeedBuyNumber(12), 10); // 12个人买10瓶 assertEqual(test.countNeedBuyNumber(60), 49); // 60个人买49瓶 assertEqual(test.countNeedBuyNumber(1000), 801); // 1000个人买801瓶 assertEqual(test.countNeedBuyNumber(12345), 9877); // 12345个人买9877瓶 } /** * 由于不想用JUnit, 特地写的一个用于断言的方法. */ public static void assertEqual(int actual, int expected) throws Exception { if (actual != expected) { throw new NullPointerException("预计值:[" + expected + "]与实际值:[" + actual + "]不等!"); } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值