需求
目前有100名囚犯,每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号(要求这些囚犯的编号是不能重复的),然后让他们依次站成一排。(注:位置是从1开始计数的),接下来,国王命令手下先干掉全部奇数位置处的人。剩下的人,又从新按位置1开始,再次干掉全部奇数位置处的人,依此类推,直到最后剩下一个人为止,剩下的这个人为幸存者。
具体功能点的要求如下:
请输出幸存者的编号,以及他第一次所占的位置值是多少。
/**
* 求囚犯幸存者问题
*/
public class Test1 {
public static void main(String[] args) {
//定义一个列表用来存放初始的囚犯
ArrayList<Integer> arrayList = new ArrayList<>();
Random r = new Random();
//随机产生100个不重复的囚犯编号
for (int i = 0; i < 100; i++) {
int index = r.nextInt(1, 201);
if (judge(arrayList, index)) {
i--;
}else {
//将囚犯放到指定位置
arrayList.add(index);
}
}
//复制出一个相同的列表,用来求得最后存活囚犯的初始位置
ArrayList<Integer> arrayList1 = new ArrayList<>();
for (int i = 0; i < 100; i++) {
arrayList1.add(i,arrayList.get(i));
}
while (arrayList.size() != 1) {
for (int i = 0; i < arrayList.size(); i++) {
//如果编号为偶数位置,将该位置的编号置为0 (因为我从0开始排列,所以去除奇数位置就变成了去除偶数问题)
if(i%2 == 0){
arrayList.set(i,0);
}
}
for (int i = 0; i < arrayList.size(); i++) {
//移除编号为0的元素,相当于删除偶数位置的元素
if(arrayList.get(i) == 0){
arrayList.remove(i);
}
}
}
System.out.println("幸存者的编号为" + arrayList.get(0));
//根据罪犯的编号得到其初始位置
for (int i = 0; i < arrayList1.size(); i++) {
if(arrayList.get(0) == arrayList1.get(i)){
//因为本代码从0开始,题目要求从1开始所以加1即可
System.out.println("幸存者第一次占位的地方为"+(i + 1));
break;
}
}
}
//用来判断生成的随机数是否已经存在
private static boolean judge(ArrayList<Integer> arrayList, int index) {
for (int i = 0; i < arrayList.size(); i++) {
if (arrayList.get(i) == index) {
return true;
}
}
return false;
}
}
本人是一个Java小白,如有什么不足请各位大神指教。