数据与集合解法请看
https://blog.csdn.net/m0_51283856/article/details/111166914
链表解法
public class Node {
//创建结点,结点数据就为会员id
int id;
Node next;
public Node() {
}
public Node(int id) {
this.id = id;
}
}
public static void count(int n) {
//计数用
int k = 3;
//生成头结点,头结点没有数据
Node head = new Node();
//辅助指针,指向当前,现在还没有形成链表,让其指向头部
Node cur = head;
//构造链表
for (int i = 1; i <= n; i++) {
//循环创建结点
Node node = new Node(i);
//上个结点指向新创建的结点
//假如这里是第一轮的话,刚才cur就是head头结点,现在让其指向刚创建的1号结点
cur.next = node;
//新创建的结点赋给当前结点
cur = node;
}
//链表创建完以后,cur就是最后一个结点,现在让其指向头部指向的那个结点也就是第一个结点形成环状
cur.next = head.next;
//head 结点是没有数据的,所有开始时候从head.next()结点开始
Node p = head.next;
//当p等于p的时候,链表里就剩一个结点了 结束循环
while(p.next != p) {
for(int i = 1;i < k - 1; i++) {
p = p.next; //报数12时候p指向下一个
}
//这里淘汰一个
p.next = p.next.next;
p = p.next; // p两个next后给了p
}
System.out.println(p.id);
}
public static void main(String[] args) {
count(10);
}
递归解法
int f(int n, int m){
if(n == 1) return n;
return (f(n - 1, m) + m - 1) % n + 1;
}