黑马程序员技术交流社区

标题: 丢手帕问题,约瑟夫问题 [打印本页]

作者: TW莞尔一笑    时间: 2014-12-31 11:26
标题: 丢手帕问题,约瑟夫问题
丢手帕问题,约瑟夫问题是个有名的问题:
                N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
                例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
有没有同学有好的思路,只需要思路就行,代码我自己来....
作者: 王晓杰    时间: 2014-12-31 11:54
我也在线等吧 没思路
作者: 魅影惊鸿    时间: 2014-12-31 14:52
整一个循环链表来模拟这圈人就行吧
作者: zhaojiajun    时间: 2014-12-31 15:47
楼上方法可行
作者: TW莞尔一笑    时间: 2014-12-31 16:22
魅影惊鸿 发表于 2014-12-31 14:52
整一个循环链表来模拟这圈人就行吧

环形链表貌似可行....
作者: 任冰冰    时间: 2014-12-31 17:45
用一个一维数组比如是a[6] 就意思是6个人(设置一个计数器 flog = 6 ),初始值是1,满足条件就变为0 ,如果是0 就不参加活动了,知道(flog = 1) 就输出那个人的下标
作者: 夜枫冷    时间: 2014-12-31 18:07
好深奥的样子啊
作者: ︻$▅屠龙▆◤    时间: 2014-12-31 22:50
这个很简单。我给你发代码吧。就数字不一样,其他思路都一样。一等
作者: ︻$▅屠龙▆◤    时间: 2014-12-31 22:51
package practice;

import java.util.ArrayList;
import java.util.Iterator;
//每14个人去1,有100个人。最后剩的是谁。
public class Demo9 {

        public static void main(String[] args) {

                int count = 0;
                ArrayList<String> list = new ArrayList<String>();
               
                for (int i = 1; i <=100; i++) {
                           list.add(i+"");
                }
                System.out.println(method(count, list));
        }

        private static ArrayList<String> method(int count, ArrayList<String> list) {
                ArrayList<String> arrayList = new ArrayList<String>();
               
                Iterator<String> it = list.iterator();
               
                while(it.hasNext()){
                        count++;
                       
                        String s = it.next();       
                       
                        if(count%14 != 0){
                                arrayList.add(s);
                        }
                        else{
                                count = 0;
                        }
                }
                        if(arrayList.size()>1)
                                 return method(count,arrayList);
                        return arrayList;
        }
}
一样的题
作者: ︻$▅屠龙▆◤    时间: 2014-12-31 22:53
学JAVA的人用C的数组来解决问题,不专业,最好用集合做
作者: taifeng    时间: 2015-1-1 01:41
楼上方法也比较好
作者: taifeng    时间: 2015-1-1 01:52
上面代码那个还是不错的
作者: Awizard    时间: 2015-1-1 23:26
数组也能做吧,boolean[]型的,判断是否杀,杀就改为假,定义两个计数器。每凑够m个真杀一次(通过判断角标是否超过N转圈),第二个计数器用来记杀了几次,杀了N-1个的时候,输出元素为真的序号加1。这样可以么?
作者: TW莞尔一笑    时间: 2015-1-2 19:28
︻$▅屠龙▆◤ 发表于 2014-12-31 22:51
package practice;

import java.util.ArrayList;

java基础我只看到面向对象,现在还看不懂,但是感谢你给的代码,等学到这里了我再来看。
作者: yuZhe_toString    时间: 2015-1-3 23:56
自定义一个循环链表,每个人看作一个对象,每个对象都有下一个对象的引用,最后一个对象拥有第一个对象的引用,循环删除链表中的元素,直到该对象找不到下一个对象为止,该对象就是最后剩下的人,这是我目前想到最简单的方法。
作者: 小平    时间: 2015-1-4 01:08
1。排序,2,找出




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