有趣的题目

问题:有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) + " 个人");
 
        /*
         * 不难看出,本题最核心的还是求每次循环时需要删除的那个元素的下标。
         */
 
    }
}

代码虽少,但不代表时间复杂度就降低了,只是更便于理解了。有兴趣的童鞋可以对比下本代码和网上代码的执行速度

原文地址:https://www.cnblogs.com/altman29/p/4903582.html