第一题
需求
目前有100名囚犯,每个囚犯的编号的1~200之间的随机数。现在要求依次随机生成100名囚犯的编号(需求这些囚犯的编号不能重复),然后依次站成一排。(注:位置是从1开始的),接下来国王命令手下先干掉全部奇数位置处的人,剩下的人,又从新按位置1开始,再次干掉全部奇数位置处的人,依此类推,直到最后剩下一个人为止,剩下的这个人为幸存者。
具体功能点的要求如下:
请输出幸存者的编号,以及他第一次所占的位置值是多少。
评分细则:
能做出第一步:生产100个随机编号,且占位成功,给3分。
能成功删除奇数位置处的数据的,给5分。
能正确获取结果的给2分。
package Demo0707;
import javafx.scene.control.RadioMenuItem;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test1 {
//目标:完成幸存者案例
//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++) {
while (true) {
int code = r.nextInt(200) + 1;
// 判断这个编号是否是唯一的。
if (isCanUse(code)) {
People p = new People(code, i);
peoples.add(p);
break; // 代表当前囚犯添加成功
}
}
}
System.out.println("囚犯占位:" + peoples);
//4.反复删除奇数位的人,直到剩余一个人为止,
//peoples = {p1, p2, p3, p4, p5, p6...}
// 0 1 2 3 4 5
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;
}
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; //此编号,没有重复,可以使用
}
}