62,621
社区成员
发帖
与我相关
我的任务
分享
public class T {
public static void main(String[] args) {
Circle c = new Circle(30);// 初始化30个学生
System.out
.println("-------------------------检查每个child的情况-------------------------");
c.check();
System.out
.println("-------------------------以下为每一次淘汰情况-------------------------");
c.launch();
}
}
class Child {
private int id;
private Child prev;
private Child next;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public Child getPrev() {
return prev;
}
public void setPrev(Child prev) {
this.prev = prev;
}
public Child getNext() {
return next;
}
public void setNext(Child next) {
this.next = next;
}
}
class Circle {
List<Child> children = new ArrayList<Child>();
// new Circle时初始化数据 ccount为child数量
Circle(int ccount) {
for (int i = 1; i <= ccount; i++) {
Child c = new Child();
c.setId(i);
children.add(c);
}
for (int i = 0; i < children.size() - 1; i++) {
children.get(i).setNext(children.get(i + 1));
children.get(i + 1).setPrev(children.get(i));
}
children.get(children.size() - 1).setNext(children.get(0));
children.get(0).setPrev(children.get(children.size() - 1));
}
// 检查list里的内容
void check() {
for (int i = 0; i < children.size(); i++) {
Child c = children.get(i);
System.out.println(c.getId() + "号的前一个是" + c.getPrev().getId()
+ "号,后一个是" + c.getNext().getId() + "号");
}
}
// 执行任务
void launch() {
Child c = children.get(0);
int count = 0;
while (children.size() > 1) {
count++;
if (count == 3) { //数到3时修改指针 移除数据
c.getPrev().setNext(c.getNext());
c.getNext().setPrev(c.getPrev());
children.remove(c);
count = 0;
// 打印每一次的情况
for (Child child : children) {
System.out.print(child.getId() + " ");
}
System.out.println();
}
c = c.getNext();
}
System.out.println("最后剩下的child的id为: " + children.get(0).getId());
}
}
public class YSF {
/**
* 约瑟夫环
* @param m 数到m退出
* @param n 共有n个人
* @param k 从第k个开始数
* @return
*/
private static int ysf(int m, int n, int k) {
int result = 0;
for (int i = 2; i <= n; i++) {
result = (result + m) % i;
}
return result + k % n;
}
public static void main(String[] args) {
System.out.println(ysf(3, 500, 1));
}
}
import java.util.ArrayList;
public class t2 {
static int m = 0;
public static void main(String args[]) {
ArrayList<Integer> a = new ArrayList<Integer>();
for (int i = 1; i <= 500; i++) {
a.add(i);// 把每个小朋友的号码依次放入.
}
while (a.size() > 1) { //当a.size()==1就只有一个人了,也就没必要循环了,那就是最后一个了
for (int i = 0; i < a.size(); i++) {
m++;//相当于报数
if (m % 3 == 0) {//数到三的人退出
m = 0;
a.remove(i);//退出
i--;//删掉了当前结点,后面的结点就会前移,就是索引会-1,
//下一轮循环该从第i个开始,也就是现在的第i+1个人就是下一轮循环的第i个人
}
}
}
System.out.println("最后一个小朋友的号码是: " + a.get(0));
}
}