要实现这个功能,我们可以使用队列(Queue)来模拟这个过程。在Java中,我们可以使用LinkedList
作为队列的实现,因为它支持在头部和尾部进行插入和删除操作。
以下是Java代码实现:
import java.util.LinkedList;
import java.util.Queue;
public class LastPersonStanding {
public static void demo(int n) {
if (n <= 0) {
throw new IllegalArgumentException("Number of people must be positive");
}
Queue<Integer> queue = new LinkedList<>();
// 初始化队列,将人的编号从1到n加入队列
for (int i = 1; i <= n; i++) {
queue.offer(i);
}
while (queue.size() > 1) {
// 遍历队列,每次跳过2个人(报1和报2的人)
for (int i = 0; i < 2; i++) {
if (!queue.isEmpty()) {
queue.poll(); // 移除报1或报2的人
}
}
}
// 队列中剩下的那个人就是最后留下的人
System.out.println("The last person standing is originally number " + queue.poll());
}
public static void main(String[] args) {
demo(10); // 示例:10个人围成一圈
}
}
在这段代码中,我们首先检查输入的人数n
是否大于0。然后,我们创建一个队列queue
,并将1到n
的整数加入队列中。接下来,我们进入一个循环,只要队列中的人数大于1,就继续执行。在循环内部,我们遍历队列,但是每次只移除报1和报2的人(即每次循环中移除两个人)。最后,队列中剩下的那个人就是最后留下的人,我们打印出这个人的编号。
请注意,这个实现假设报数是从队列头部开始的,也就是说,每次报数时,队列头部的人首先报数。如果报数规则不同(例如从尾部开始报数),那么实现方式会有所不同。此外,这个实现也假设每次移除的人都是队列头部的人,这是因为在每次循环中,我们首先移除了报1和报2的人。如果报数逻辑或移除逻辑有所不同,那么代码也需要相应地调整。