約瑟夫環的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);
}
相關文章
相關標籤/搜索