約瑟夫環問題

1、題目描述

已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號爲k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。

2、思想

假設有n個人,從1到n,放入一個ArrayList中,設置開始的編號k(設爲0,爲第一個人),加上需要報的數減1,即得到需要出列人的索引,要注意要出列的人是不是最後一個人,要特殊處理。當ArrayList爲空,則完成。

時間複雜度O(n),空間複雜度O(n)

3、代碼實現

import java.util.ArrayList;
public class Main3 {
    public static void yesefu(int totalNum,int countNum) {
        //初始化人數
        ArrayList<Integer> start = new ArrayList<Integer>();
        for(int i=1;i<=totalNum;i++) {
            start.add(i);
        }
        //從第k個數開始計數
        int k = 0;//從第一個人開始計數
        while(start.size() > 0) {
            k = k + countNum;
            //第m人的索引位置
            k = k % (start.size()) - 1;//因爲索引是從0開始,進行取餘是因爲防止k大於圈中人的總數
            //判斷是否到隊尾,即k的大小爲start的大小,此時k爲-1
            if(k < 0) {
                //如果到隊尾了,則輸出隊尾元素
                System.out.print(start.get(start.size()-1)+" ");
                start.remove(start.size() - 1);
                k = 0;
            }else {
                //否則,直接輸出k對應的元素
                System.out.print(start.get(k)+" ");
                start.remove(k);
            }
            
        }
        
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        yesefu(10,3);

    }

}
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章