题目
代码
People.java
package com.zhang.demo1;
import com.sun.javaws.jnl.IconDesc;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-10-10
*/
public class People {
private int code;//编号
private int location;//位置
public People(int code, int location) {
this.code = code;
this.location = location;
}
public People() {
}
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public int getLocation() {
return location;
}
public void setLocation(int location) {
this.location = location;
}
@Override
public String toString() {
return "People{" +
"code=" + code +
", location=" + location +
'}';
}
}
Test1.java
package com.zhang.demo1;
import java.util.*;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-10-10
*/
public class Test1 {
public static List<People> peoples = new ArrayList<>();
public static void main(String[] args) {
//目标:完成幸存者案例
//1. 由于每个囚犯是一个对象,并且我们需要知道每个囚犯的编号和位置,实验我们把囚犯定义成对象来实现这个案例会更好
//2. 创建100囚犯,依次站位,并为其生成编号(1-200之间的随机数,不能重复)
//3. 循环100次,创建100个犯人,存入集合
Random random = new Random();
for (int i = 1; i <= 100; i++) {
while (true) {
int code = random.nextInt(200) + 1;
if (isCanUse(code)) {
People p = new People(code, i);
peoples.add(p);
break;//代表当前囚犯添加成功
}
}
}
//循环完成,都已经添加成功
System.out.println("囚犯编号及站位"+peoples);
//4. 反复删除奇数位置的人,直到剩下一个人为止
while(peoples.size()>1){
//干掉奇数位置的人,就是留下偶数位置的人
List<People> temptPeoples = new ArrayList<>();
for(int i = 1;i < peoples.size();i+=2){
People p = peoples.get(i);
temptPeoples.add(p);
}
peoples = temptPeoples;
}
System.out.println(peoples);
People luckPeople = peoples.get(0);
System.out.println("幸运者站的位置是"+luckPeople.getLocation());
}
public static boolean isCanUse(int code) {
for (People people : peoples) {
if (people.getCode() == code) {
return false;
}
}
return true;
}
}
Test1_1
package com.zhang.demo1;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @Author: ggdpzhk
* @CreateTime: 2024-10-10
* 幸存者问题
*/
public class Test1_1 {
public static List<People> peoples = new ArrayList<>();
public static void main(String[] args) {
//1. 先 生成囚犯的队列,因为每个囚犯有 站位 和 编号,因此把囚犯包装成一个对象更好(写好了一个People类,有囚犯的编号和站位)
//2.随机数生成100囚犯的编号(1-200且不能重复)
Random random = new Random();
for(int i = 1;i <= 100;i++){//i从0还是1开始都行,只是一个循环的数字,但是因为后面用i做位置的序号,位置的序号肯定是从1开始嘛,所以就是i= 1
while (true) {
int code = random.nextInt(200) + 1;
if(isCanUse(code)){
People p = new People(code,i);
peoples.add(p);
break;
}
}
}
//循环完成,已经生成了100个囚犯的编号和站位
System.out.println("囚犯站位:"+peoples);
//3. 正 确删除奇数位置的数据,直到只剩下一个
while (peoples.size()>1){
for (int i = 0;i < peoples.size(); i++) {
peoples.remove(i);
}
}
System.out.println(peoples);
System.out.println("最后一个人的位置是"+peoples.get(0).getLocation());
/* peoples.remove(0);
System.out.println(peoples);
System.out.println(peoples.get(0));*/
}
public static boolean isCanUse(int code){
for (People people : peoples) {
if(people.getCode() == code){
return false;
}
}
return true;
}
}
Test1和Test1_1的区别
就是在删除奇数位置 直到剩下一个数据 这个方法
使用偶数或者倒着删的方法能保证位置不动还是怎么,反正不一样,有点印象吧