有n個人圍成一圈,從第一個開始報數(shù)窄坦,每次數(shù)到m的人出圈拴驮,直到剩下最后一個人春瞬。
這個問題,可以借助隊(duì)列套啤。
import java.util.LinkedList;
import java.util.Queue;
// 有n個人圍成一圈宽气,從第一個開始報數(shù),每次數(shù)到m的人出圈潜沦,直到剩下最后一個人
// 通過隊(duì)列(Queue)來實(shí)現(xiàn)這個循環(huán)鏈表抹竹,每次將隊(duì)首元素移動到隊(duì)尾,以此模擬環(huán)狀結(jié)構(gòu)止潮。報數(shù)為m的人將被移出隊(duì)列窃判,直到隊(duì)列中只剩下一個元素,即最后留下的人喇闸。最后袄琳,返回這個人的編號
public class 約瑟夫環(huán)問題 {
public static void main(String[] args) {
int n = 18; // 總?cè)藬?shù)
int m = 5; // 報數(shù)的數(shù)字
initQueue(n, m);
}
static void initQueue(int num, int m) {
Queue<Integer> queue = new LinkedList<>();
for (int i = 1; i<=num;i++) {
queue.offer(i);
}
// 模擬報數(shù)過程
int count = 0; // 計(jì)數(shù)器
while (queue.size() > 1) { // 留下唯一一個人
count++;
if (count == m) {
queue.poll(); // 報數(shù)為m的人
count = 0; // 重置計(jì)數(shù)器
} else {
// 取得當(dāng)前非特殊的數(shù)字
int front = queue.peek();
// 將數(shù)字從隊(duì)列頭移除
queue.poll();
// 加入到隊(duì)列尾
queue.offer(front);
}
}
// 最后剩余的隊(duì)列中的數(shù)字
System.out.println(queue.poll());
}
}