黑马程序员技术交流社区

标题: 一个很难的算法题,能独自做出来的都是大神。 [打印本页]

作者: HARRY_yFd0S    时间: 2016-9-8 21:17
标题: 一个很难的算法题,能独自做出来的都是大神。
本帖最后由 HARRY_yFd0S 于 2016-9-8 23:21 编辑

题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号。
各位大神可以挑战一下。


作者: LoneRan9er    时间: 2016-9-8 22:00
很感兴趣  求大神解答一下 啊
作者: HARRY_yFd0S    时间: 2016-9-8 22:24
20行代码做出来了,好开心
作者: HARRY_yFd0S    时间: 2016-9-8 22:41
贴出我的代码,验证过几组数据,都是ok的
        public static void main(String[] args) {
                ArrayList<Integer> al = new ArrayList<Integer>();
                Scanner scanner = new Scanner(System.in);
                System.out.println("请输入人数:");               
                int n = scanner.nextInt();               
                for (int i = 1; i <= n; i++) {
                        al.add(i);
                }               
                int i = 0;               
                while(al.size() > 1) {
                        i += 2;
                        while(i > al.size() - 1) {
                                i = i - al.size();
                        }       
                        al.remove(i);       
                }               
                System.out.println("最后一个人的编号是:"+al.get(0));
        }
作者: 勿忘`初心    时间: 2016-9-8 23:07
好难,这是谁出的题
作者: &天马星空ぁ    时间: 2016-9-8 23:13
HARRY_yFd0S 发表于 2016-9-8 22:41
贴出我的代码,验证过几组数据,都是ok的
        public static void main(String[] args) {
                ArrayList al = ne ...

很厉害,看了好一会算法才看明白,膜拜
作者: 岳阳天    时间: 2016-9-8 23:14
private static int getNum(int i) {
                //创建集合,存储人数
                ArrayList<Integer> list = new ArrayList<Integer>();
                //遍历,把每个人的代号添加到数组中
                for (int j = 1;  list.size()<i ; j++) {
                        list.add(j);
                }
                int count = 1;
                for (int j = 0; list.size()!=1; j++) {
                        //如果索引是最后一个加一,那么让索引归零
                        if(j == list.size()){
                                j = 0;
                        }
                        if(count %3 ==0){
                                //没数到三个删除一次
                                list.remove(j--);
                        }
                        count ++;
                }
                return list.get(0);
        }
作者: HARRY_yFd0S    时间: 2016-9-8 23:16
岳阳天 发表于 2016-9-8 23:14
private static int getNum(int i) {
                //创建集合,存储人数
                ArrayList list = new ArrayList();

大神真厉害!
作者: yigezhifu    时间: 2016-9-8 23:39
这题不难啊
作者: IT南    时间: 2016-9-8 23:40
我操  牛逼,搞了半天没搞出来 睡觉
作者: MarsBong    时间: 2016-9-8 23:40
说下思路吧,存到list集合中,然后计算报数,使用迭代,并且迭代的过程中计数,计数到3,将刚迭代的元素移出集合,计数器归零,继续从下一个迭代,并且重复上述步骤,注意迭代的过程是循环不断的,只有满足只有一个元素时,才结束迭代,跳出循环
作者: a65912555    时间: 2016-9-8 23:46
顶顶顶~~
作者: houseofthrones    时间: 2016-9-10 00:15
这道题好难




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2