约瑟夫问题:
约瑟夫问题:有 N 个人围成一圈,每个人都有一个编号,编号由入圈的顺序决定,第一个入圈的人编号为 1,最后一个为 N,从第 k (1<=k<=N)个人开始报数,数到 m (1<=m<=N)的人将出圈,然后下一个人继续从 1 开始报数,直至所有人全部出圈,求依次出圈的编号。
Queue<Integer> queue = new LinkedList<>();
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
for (int i = 1; i <= n; i++) {
queue.add(i);
}
int count = 0;
while (!queue.isEmpty()) {
Integer poll = queue.poll();
count++;
if (count == m) {
System.out.println(poll);
count = 0;
} else {
queue.add(poll);
}
}
思路很简单 利用队列的特性 让排队的人想象成一个圈 定义一个计数模拟遍历出来的人的排行 每次遍历判断该人排行是不是m 如果是的话 移除不再放入队列 记数变0 如果不是移除再放入队列 计数+1