20个人围成一圈,按照1-20进行编号,按照1 2 3报数,每次报3的人出局,求最后剩下的那一个人的编号java
时间: 2024-02-22 15:56:33 浏览: 62
可以使用循环链表来模拟这个过程,具体实现步骤如下:
1. 创建一个循环链表,链表中节点的值为人的编号,从1到20依次排列。
2. 定义一个指针,初始指向链表的头节点。
3. 使用循环遍历链表,每次循环时,让指针指向当前节点的下一个节点,同时计数器加1。
4. 当计数器的值为3时,将当前节点从链表中删除,同时计数器清零。
5. 重复步骤3和4,直到链表中只剩下一个节点为止。
6. 返回最后剩下的那个节点的编号。
Java代码实现如下:
```java
public class JosephRing {
public static void main(String[] args) {
int n = 20; // 总人数
int m = 3; // 报数为3的出局
int last = getJosephRingLast(n, m);
System.out.println("最后剩下的人的编号为:" + last);
}
private static int getJosephRingLast(int n, int m) {
// 创建循环链表
Node head = new Node(1);
Node tail = head;
for (int i = 2; i <= n; i++) {
tail.next = new Node(i);
tail = tail.next;
}
tail.next = head;
// 定义指针和计数器
Node p = head;
int count = 1;
// 循环遍历链表
while (p.next != p) {
count++;
if (count == m) {
// 删除当前节点
tail = p.next;
p.next = tail.next;
count = 1;
} else {
// 指向下一个节点
p = p.next;
}
}
// 返回最后剩下的节点的编号
return p.value;
}
// 定义链表节点类
private static class Node {
int value;
Node next;
public Node(int value) {
this.value = value;
}
}
}
```
阅读全文