约瑟夫环的Java实现

关于约瑟夫环的问题,可能很多人都比较清楚。

但我头一次听说是在一个面试的时候,当时完全懵逼呀。

本身算法这块就是很薄弱的。结果可想而知,想了很久都没有想通。

现在抽空整理一下对应这个算法的理解。

题目我就不累述了。

把自己的思想记下来

如果我们把这个问题简单了看,就是在一个数组里通过下标删除元素。

那么你会说,明明是一个环型,不错,但是我们要把这个问题抽象一下。

通过不断的移动下标删除元素,其实就是和环形的去删除一个意思。

 

1.首先,你要知道求余这个东西。

示例:3%5=3    19%8=3

通过第二个19%8的例子就可以知道。

19=8*2+3

通俗的就是,在一个19人的队伍了,从1开始报数,到队尾之后从队首接着数。19个数会数到几呢?

第三遍报数到第三个人的时候结束了。

所以由这个例子反向推约瑟夫环的问题,就没有那么抽象了。

 

假定有10个人,分别是[ A B C D E F G H I J ]。每次踢出数到3的人,从第一个开始

你用这个算法就能得到每次踢出去的人的问题了。

第一个开始就是下标为0的,踢出数3的人就是间隔是3

那么你就可以这么玩。

(0+3-1)%10=2  踢出下标2的人

(2+3-1)%9=4    踢出当前剩余人力下标为4的人。

以此类推。

这个问题就可以解决了。

具体代码如下

public Yue(int number,int start,int distance){
    List<String> list=new ArrayList<String>();
    for(int i=0;i<number;i++){
        list.add((char)('A'+i)+"");
    }
    System.out.print("约瑟夫环("+number+","+start+","+distance+"),");
    System.out.println(list.toString());
    int i=start;
    while(list.size()>1){
        i=(i+distance-1)%list.size();
        System.out.print("删除的元素:"+list.remove(i).toString()+",");
        System.out.println(list.toString());
    }
    System.out.println("被赦免的罪犯是:"+list.get(0).toString());
}

public static void main(String[] args) {
    new Yue(10,1,3);
}

 

posted on 2017-03-03 23:58  Mr.小魔  阅读(239)  评论(0)    收藏  举报