有趣的题目
问题:有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
这个题目是自己在做黑马程序员入学测试时遇到的,想了一个多小时,终于想到了自己的解决方法,网上的过程很繁杂,其实真正的核心代码也就4行,上代码:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
public class Test10 { public static void main(String[] args) { /* * 先说说我做这题的思路: * 1、创建一个含有100个元素的集合,元素从1到100。(分别对应这100个人) * 2、从1数到14算一圈,则相当于走了99个圈,每走一圈从集合里删除一个元素。 * 3、走完这99圈以后,集合里剩下的那个元素就是最后剩下的人 * * 这里最关键的就是求每次从集合里删除的那个元素的下标。 */ //创建一个集合all,集合中的元素为1,2,3,……,100,代表所有人 List<Integer> all = new LinkedList<Integer>(); for(int i = 1;i <= 100;i++){ all.add(i); } //下面的代码表示循环99次,每次从集合里删除一个元素,代表退出的那个人的编号 //i表示退出的那个人在all集合中的下标 int i = 0; //循环99次 for(int n = 1;n < 100;n++){ //每次循环时,求得将要退出的人在集合中的下标 i = (i + 13) % all.size(); //将集合中代表该人的元素删除 all.remove(i); } //循环99次,删除99个人,剩下的最后一个,就是你了 System.out.println("最后剩下的是第 " + all.get(0) + " 个人"); /* * 不难看出,本题最核心的还是求每次循环时需要删除的那个元素的下标。 */ } } |
代码虽少,但不代表时间复杂度就降低了,只是更便于理解了。有兴趣的童鞋可以对比下本代码和网上代码的执行速度
作者:拾叁妖
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步