题目
模拟约瑟夫环(数组或链表):n 人报数 m 出列
思路
本题模拟约瑟夫环(数组或链表):n 人围圈报数 m,第 m 个出列,直到剩一人或输出出列顺序。 可用数组标记存活或链表模拟;从当前位置数 m 个活人,出局后继续从下一位报数,直到满足题面停止条件。
解题分析
约瑟夫环(数组或链表)模拟:数组标记是否出局,从当前位置报数到 m 的出局,下一位继续,直到剩 0 人。n、m 不大时 O(n²) 模拟足够;n 很大时有递推公式 O(n),但理解成本高,练手先用模拟。
完整程序
import java.io.*;
public class Main {
public static void main(String[] args) {
int n = 5, m = 2;
boolean[] alive = new boolean[n];
Arrays.fill(alive, true);
int left = n, i = 0, cnt = 0;
while (left > 0) {
if (alive[i]) {
cnt++;
if (cnt == m) {
System.out.print((i + 1) + " ");
alive[i] = false; left--; cnt = 0;
}
}
i = (i + 1) % n;
}
System.out.println();
}
}
运行示例
输出:
2 4 1 5 3