约瑟夫环的Java实现

关于约瑟夫环的问题,可能不少人都比较清楚。面试

但我头一次据说是在一个面试的时候,当时彻底懵逼呀。算法

自己算法这块就是很薄弱的。结果可想而知,想了好久都没有想通。数组

如今抽空整理一下对应这个算法的理解。spa

题目我就不累述了。code

把本身的思想记下来blog

若是咱们把这个问题简单了看,就是在一个数组里经过下标删除元素。rem

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

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

 

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

示例: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);
}
相关文章
相关标签/搜索