问题:有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) + " 个人"); /* * 不难看出,本题最核心的还是求每次循环时需要删除的那个元素的下标。 */ } } |
代码虽少,但不代表时间复杂度就降低了,只是更便于理解了。有兴趣的童鞋可以对比下本代码和网上代码的执行速度