幸运者问题 20

幸运者问题

需求分析

现在有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;
        }

    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值