约瑟夫环问题是一个数学的应用问题:已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。
输入输出样例:
import java.util.ArrayList;
import java.util.Scanner;
public class Josephus {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n, k, m, index;
n = scan.nextInt();
k = scan.nextInt();
m = scan.nextInt();
ArrayList<String> arr = new ArrayList<String>();
for(int i = 1; i <= n; i++) {
arr.add(String.valueOf(i));
}
index = k - 1;
index = (index + m - 1) % n;
System.out.print(arr.get(index));
arr.remove(index);
for(int i = 0; i < n-1; i++) {
index = (index + m - 1) % arr.size();
System.out.print(" ");
System.out.print(arr.get(index));
arr.remove(index);
}
}
}
有两个点:
- 使用 ArrayList 及其 remove() 和 get() 方法,模拟人员的出列,删除某个下标的元素,其后元素自动向前补齐;
- 使用 index = (index + m - 1) % arr.size() 的算法,解决循环的问题。