A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© TW莞尔一笑 中级黑马   /  2014-12-31 11:26  /  1790 人查看  /  16 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

丢手帕问题,约瑟夫问题是个有名的问题:
                N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。
                例如N=6,M=5,被杀掉的人的序号为5,4,6,2,3。最后剩下1号。
有没有同学有好的思路,只需要思路就行,代码我自己来....

16 个回复

倒序浏览
我也在线等吧 没思路
回复 使用道具 举报
整一个循环链表来模拟这圈人就行吧
回复 使用道具 举报
楼上方法可行
回复 使用道具 举报
魅影惊鸿 发表于 2014-12-31 14:52
整一个循环链表来模拟这圈人就行吧

环形链表貌似可行....
回复 使用道具 举报
用一个一维数组比如是a[6] 就意思是6个人(设置一个计数器 flog = 6 ),初始值是1,满足条件就变为0 ,如果是0 就不参加活动了,知道(flog = 1) 就输出那个人的下标
回复 使用道具 举报
好深奥的样子啊
回复 使用道具 举报
这个很简单。我给你发代码吧。就数字不一样,其他思路都一样。一等
回复 使用道具 举报
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:54
回复 使用道具 举报
学JAVA的人用C的数组来解决问题,不专业,最好用集合做
回复 使用道具 举报
楼上方法也比较好
回复 使用道具 举报
上面代码那个还是不错的
回复 使用道具 举报
数组也能做吧,boolean[]型的,判断是否杀,杀就改为假,定义两个计数器。每凑够m个真杀一次(通过判断角标是否超过N转圈),第二个计数器用来记杀了几次,杀了N-1个的时候,输出元素为真的序号加1。这样可以么?
回复 使用道具 举报
︻$▅屠龙▆◤ 发表于 2014-12-31 22:51
package practice;

import java.util.ArrayList;

java基础我只看到面向对象,现在还看不懂,但是感谢你给的代码,等学到这里了我再来看。
回复 使用道具 举报
yuZhe_toString 来自手机 中级黑马 2015-1-3 23:56:15
15#
自定义一个循环链表,每个人看作一个对象,每个对象都有下一个对象的引用,最后一个对象拥有第一个对象的引用,循环删除链表中的元素,直到该对象找不到下一个对象为止,该对象就是最后剩下的人,这是我目前想到最简单的方法。
回复 使用道具 举报
1。排序,2,找出
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马