需求
目前有100名囚犯,每个囚犯的编号是1-200之间的随机数。现在要求依次随机生成100名囚犯的编号(要求这些囚犯的编号是不能重复的),然后让他们依次站成一排。(注:位置是从1开始计数的),接下来,国王命令手下先干掉全部奇数位置处的人。剩下的人,又从新按位置1开始,再次干掉全部奇数位置处的人,依此类推,直到最后剩下一个人为止,剩下的这个人为幸存者。
具体功能点的要求如下:
请输出幸存者的编号,以及他第一次所占的位置值是多少。
实现思想:
1.创建集合arr用来存放生成的编号
2.循环100次,产生不重复的编号存入arr集合
3.创建一个新的集合arr2,将存放的生成编号的集合赋值给新的集合,以便后续查找索引
4.在创建新的集合people,将索引为偶数的存入到新的集合
5.输出幸存者编号,且在arr2集合中根据编号查找到索引
实现代码1:
package pratice1;
import java.util.*;
public class Test {
public static void main(String[] args) {
//1.创建一个集合
List<Integer> arr = new ArrayList<>();
Random r = new Random();
//2.循环100次
for (int i = 0; i < 100; i++) {
while (true) {
//3.判断集合中是否已经出现过这个编号
int c = r.nextInt(200) + 1;
// contains返回ture 或false 如果有就重新生成
if (!arr.contains(c)) {
arr.add(c);
break;
}
}
}
System.out.println(arr);
//4.备份第一个集合,以便后续查找索引
List<Integer> arr2 = new ArrayList<>();
arr2=arr;
while (arr.size()>1){
List<Integer> people = new ArrayList<>();
//5.将索引为偶数的添加到新的集合中去
for (int i = 1; i < arr.size(); i+=2) {
int s=arr.get(i);
people.add(s);
}
//每次将新集合people赋给arr重新遍历,直到剩余最后一个幸存者
arr=people;
}
int luckPeople=arr.get(0);
System.out.println("幸存者编号:"+luckPeople);
//6.返回幸存者索引 indexOf根据值来查找索引
int i = arr2.indexOf("幸存者所在的索引:"+luckPeople);
System.out.println(i+1);
}
}
//
运行结果:
实现代码2:
面向对象:
package pratice1;
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 +
'}';
}
}
package pratice1;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Test2 {
public static List<People> people = new ArrayList<>();
public static void main(String[] args) {
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);
people.add(p);
break;
}
}
}
System.out.println(people);
while (people.size()>1){
List<People> peoples = new ArrayList<>();
for (int i = 1; i < people.size(); i+=2) {
People p = people.get(i);
peoples.add(p);
}
people=peoples;
}
People luckPeople=people.get(0);
System.out.println(luckPeople);
}
private static boolean isCanUse(int code) {
for (People person : people) {
if(person.getCode()==code){
return false;
}
}
return true;
}
}