import java.util.ArrayList;
import java.util.List;
public class Joseph_list {
private static StringBuffer numbers = new StringBuffer();
public static void main(String[] args) {
joseph(10, 1, 3);
System.out.println(numbers.toString());
}
static void joseph(int n, int k, int m) {
// 初始化环
List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < n; i++) {
if (i + k > n) {
list.add(i + k - n);
} else {
list.add(i + k);
}
}
int num = 1;// 记录数的人数
cycleCal(list, num, m);
}
private static void cycleCal(List<Integer> list, int num, int m) {
int len = list.size();
if (len > 1) {
//i仅代表索引,每一次循环就是list从1开始报数,报数为m的人出列
for (int i = 0; i < len; i++) {
if (num == m) {
numbers.append(list.get(i) + ",");
list.remove(i);
//注意集合的大小的改变,所以要改变索引
i--;
len = list.size();
//count和i要同步
num = 0;
}
num++;
}
cycleCal(list, num, m);
} else {
numbers.append(list.get(0));
}
}
}
链表:
public class Joseph_node {
public static void main(String[] args) {
long begin = System.currentTimeMillis();
joseph(1000000,13);
long end = System.currentTimeMillis();
System.out.println("耗时:"+(end -begin)+"ms");
}
static void joseph(int n, int m) {
Node first = new Node(1);//定义第一个节点
Node point = first;//定义一个指针,指向第一个节点
for (int i = 2; i <= n; i++) {//初始化环
point.next = new Node(i);
point = point.next;
}
point.next = first;//最后一个节点与第一个节点产生关联
System.out.println("出圈的顺序为:");
while (point != point.next) {
for(int i=1;i<m;i++){
point = point.next;//将指针指向要出圈的人的前一个节点
}
System.out.print(+point.next.data+" ");
point.next = point.next.next;//每当结束一圈,将指针指向输出节点的下一个节点重新开始
}
System.out.print(point.data);
System.out.println();
}
static class Node {
int data;
Node next;
Node(int data) {
this.data = data;
}
}
}