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);
}
}
約瑟夫環問題
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.