用Java写出:n个同学围成一圈,第一个人从1开始报数,报到m的退出圈,下一个人接着从1开始报,如此反复,求最后一个剩下的人。
时间: 2024-04-17 08:26:41 浏览: 93
可以使用循环链表来解决这个问题。首先,我们创建一个循环链表,并将每个同学的依次添加到链表中。然后我们从第一个同学开始报数,每到 m 时,将当前节点从链表移除。然后,一个同学接着从 1 开始报数,直链表中只剩下一个节点为。
下面是使用 Java 实现的代码:
```java
import java.util.*;
public class LastPersonStanding {
public static int findLastPerson(int n, int m) {
// 创建循环链表,并添加同学编号
LinkedList<Integer> circle = new LinkedList<>();
for (int i = 1; i <= n; i++) {
circle.add(i);
}
int index = 0;
while (circle.size() > 1) {
index = (index + m - 1) % circle.size(); // 计算要移除的节点索引
circle.remove(index);
}
return circle.get(0); // 返回最后剩下的人的编号
}
public static void main(String[] args) {
int n = 10; // 同学的总人数
int m = 3; // 报数到 m 的同学退出圈
int lastPerson = findLastPerson(n, m);
System.out.println("最后剩下的人的编号是:" + lastPerson);
}
}
```
在上面的代码中,我们创建了一个循环链表 `circle`,并使用 `LinkedList` 类来实现。然后,我们使用一个 `while` 循环来不断报数并移除节点,直到链表中只剩下一个节点。最后,我们返回最后剩下的人的编号。
请注意,上述代码中使用的索引是从 0 开始的,所以在计算要移除的节点索引时需要进行调整。另外,该实现假设输入的 n 和 m 都是合法的,也就是说 n 大于等于 1,m 大于等于 1。如果输入不合法,可能会导致程序出现异常。
阅读全文
相关推荐








