第一题
需求:
目前有100名囚犯,每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号(要求这些囚犯的编号是不能重复的),然后让他们依次站成一排。(注:位置是从1开始计数的),接下来,国王命令手下先干掉全部奇数位置处的人。剩下的人,又从新按位置1开始,再次干掉全部奇数位置处的人,依此类推,直到最后剩下一个人为止,剩下的这个人为幸存者。
具体功能点的要求如下:
请输出幸存者的编号,以及他第一次所占的位置值是多少。
评分细则
1.能做出第一步:生产100个随机编号,且占位成功的,给3分。
2.能成功删除奇数位置处的数据的,给5分。
3.能正确获取结果的给2分。
一个囚犯代表一个对象,所以先创建对象类
public class People {
private int code;//编号
private int location;//位置
public People() {
}
public People(int code, int location) {
this.code = code;
this.location = location;
}
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 +
'}';
}
}
接下来在测试类中
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class test {
//目标完成幸存者案例
//1.由于每个囚犯都是一个对象,并且我们需要每个囚犯的位置和编号,所以我们把囚犯定义成对象来实现这个案例会更好
//2.创建100个囚犯,依次占位,并为其赋值编号(1-200之间的随机数:不能重复)
public static List<People> peoples = new ArrayList<>();
public static void main(String[] args) {
//3.循环100次,创建100个囚犯,存入集合
Random r = new Random();
for (int i = 1; i <=100 ; i++) {
int code = r.nextInt(200)+1;
//判断这个编号是否唯一,定义成一个方法
if (isCanUse(code)) {
People p = new People(code,i);
peoples.add(p);
}else {
i--;
}
}
System.out.println("囚犯信息"+peoples);
//4.反复删除奇数位置处的人,直到剩余一个人为止。
//peoples = [p1,p2,p3,p4,p5]
// 0 1 2 3 4
while (peoples.size() > 1){
//干掉奇数位置处的人,那不就是留下偶数位置处的人嘛
List<People> tempPeoples =new ArrayList<>();//创建一个临时集合
for (int i = 1; i < peoples.size(); i+=2) {
People p = peoples.get(i);
tempPeoples.add(p);
}
peoples = tempPeoples;//挑出偶数位置的人[p2,p4,p6.....]
}
People luckPeople = peoples.get(0);//此时集合里面就剩下一个人了
System.out.println(luckPeople);
}
public static boolean isCanUse(int code){
for(People people : peoples){
if (people.getCode() ==code){
return false;//重复了,不能用
}
}
return true;
}
}