幸运者问题
需求分析
现在有100个人犯人,每个人的编号是1,2,…100.国王准备赦免一个人,赦免的规则:先干掉奇数位置的人。剩下的人从新保留队列,继续干掉奇数位置的人。 直到最终剩下一个人为止,此人即是幸运者,请算出他的编号。
分析步骤
a、定义一个数组存储100个人的编号。
b、定义一个死循环,去掉奇数位置的人。
c、把非奇数位置的人的编号从新存入到新的数组中去。
d、新数组重复上述过程,直到剩下一个人为止即是幸运者。
public class LuckyNumDemo {
public static void main(String[] args) {
// 1、定义一个数组存储100个人的编号。
int[] peoples = new int[100];
// 2、存入100个人的编号进去。
for(int i = 0 ; i < peoples.length ; i++ ) {
peoples[i] = i+1;
}
System.out.println("数组内容:"+ Arrays.toString(peoples)); // --Java提供的而技术,了解会用就好!
// 3、定义一个死循环,去掉奇数位置的人。
while(true){
// 4、定义一个新数组存储本轮幸存者,本轮幸存者人数一定是数组长度/2
int[] lastPeoples = new int[peoples.length / 2];
// 5、遍历出原数组的偶数位置的人存入到新数组即可。
int index = 0 ; // 记录索引
for(int i = 1 ; i < peoples.length ; i+=2 ) {
// peoples[i]
lastPeoples[index++] = peoples[i];
}
// 6、本轮幸存者
System.out.println("本轮幸存者:"+Arrays.toString(lastPeoples));
// 7、判断幸存者是否只有一位了,就结束循环
if(lastPeoples.length == 1) break;
// 8、把新的数组地址替换老数组地址从新进行一样的筛选
peoples = lastPeoples;
}
}
}