黑马程序员技术交流社区

标题: 约瑟夫环问题,谈谈自己的理解 [打印本页]

作者: L10052108    时间: 2016-11-9 10:52
标题: 约瑟夫环问题,谈谈自己的理解
本帖最后由 L10052108 于 2016-11-12 15:00 编辑

我写这帖子主要是觉得这个程序,很有意思很多人都玩过这样的游戏,大家排队围成一个圈,开始报数,谁报道某一个数字,就出局。下一个人从头开始报数,报道最后一个人的时候,第一个人开始接着报数,循环起来。
这也是我做过的一道题

下面说说我的思路:我觉得,这道题用集合思想实现比较的好,尤其是使用Arraylist集合,因为集合是有序的。向集合中插入100个数字,代表这100个,每一个人需要报数用cont 表示,位置用index表示,如果报一次数字(count++),报数人也就变成Index++;如果这个人报数是14,让这个人出局,只需要移除对应的index,即可。由于集合特点移除以后,后面人的序号自动减一,为了保证序号正确,index子减。到了最后一个元素,第一个元素接上。循环下去,就可以知道,最后剩下的人是谁了?
代码实现:
[AppleScript] 纯文本查看 复制代码
package com.itheima;

import java.util.ArrayList;

/**
* 有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。
*
* 然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
*
* @author liuwei
*
*/
/*
* 分析: 使用arrayList集合比较方便,arraylist 是有序的,可以通过序号的判断,来判断是不是需要退出;
*/
public class Test10 {
        public static void main(String[] args) {
                // 创建 集合对象
                ArrayList<Integer> arr = new ArrayList<Integer>();

                // 向集合中添加元素
                for (int x = 1; x <= 100; x++) {
                        arr.add(x);
                }
                // 用于记录报数的
                int count = 0;

                // 用于记录报数到哪一个人的
                int index = -1;

                // 用于记录退出人数的
                int removeTime = 0;
               
                while (true) {
                        
                        count++;
                        index++;
                        
                        if (count >= 14) {
                                count = 0;
                                
                                // 控制台输出移除的数字
                                // System.out.println(arr.get(index));
                                
                                arr.remove(index);
                                
                                //  移除以后,后面的元素自动进位,此时的索引的位置应该 -1
                                index--;
                                
                                // 记录移除的次数
                                removeTime++;
                        }
                        if (index >= (arr.size() - 1)) {
                                index = 0;
                        }

                        if (removeTime >= 99) {
                                break;
                        }
                }
//                System.out.println("---------------");
                // 经过 99 次移除以后,集合中现在只剩下一个元素,也就是想要的元素
                System.out.println(arr.get(0));
        }
}

这是我自己做的,可能个别地方有错误,仅供参考,如果发现错误,还希望帮我指出,大家一起学习。
我看到论坛内还有其他同学发的帖子;
觉得不错的,我把链接发了一下
http://bbs.itheima.com/forum.php ... 6%E7%91%9F%E5%A4%AB


[学习交流] 围圈报数(约瑟夫环)的最简代码——7条语句 [复制链接]

http://bbs.itheima.com/forum.php ... 6%E7%91%9F%E5%A4%AB

http://bbs.itheima.com/forum.php ... 6%E7%91%9F%E5%A4%AB
自己多看看论坛,长见识呀

Test10.rar

872 Bytes, 下载次数: 112


作者: 默默默默    时间: 2016-11-9 12:38
这个很难,到现在都没整出来

作者: L10052108    时间: 2016-11-9 13:51
本帖最后由 L10052108 于 2016-11-9 15:47 编辑
默默默默 发表于 2016-11-9 12:38
这个很难,到现在都没整出来

有点儿绕弯,不过想一想应该不是很难,这个场景并不是很复杂,很多人都玩过这种游戏
作者: L10052108    时间: 2016-11-9 19:19
原来这是经典的 约瑟夫环 问题,真是孤陋寡闻
作者: poi1234bnm    时间: 2016-11-9 21:59
不错哦。。他们想的都是用个链环做。。还是用集合,数组更容易理解。。。运行结果怎么样??
作者: L10052108    时间: 2016-11-13 10:23
poi1234bnm 发表于 2016-11-9 21:59
不错哦。。他们想的都是用个链环做。。还是用集合,数组更容易理解。。。运行结果怎么样?? ...

运行一下就知道了
作者: 94651417    时间: 2017-4-29 09:49
答案是多少?

作者: DreamBoyMrsLin    时间: 2017-4-30 00:14
学习了  




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