幸运的囚犯

题目

在这里插入图片描述

代码

在这里插入图片描述

People.java

package com.zhang.demo1;

import com.sun.javaws.jnl.IconDesc;

/**
 * @Author: ggdpzhk
 * @CreateTime: 2024-10-10
 */
public class People {
    private int code;//编号
    private int location;//位置

    public People(int code, int location) {
        this.code = code;
        this.location = location;
    }

    public People() {
    }

    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 +
                '}';
    }
}

Test1.java

package com.zhang.demo1;

import java.util.*;

/**
 * @Author: ggdpzhk
 * @CreateTime: 2024-10-10
 */
public class Test1 {
    public static List<People> peoples = new ArrayList<>();
    public static void main(String[] args) {
        //目标:完成幸存者案例
        //1. 由于每个囚犯是一个对象,并且我们需要知道每个囚犯的编号和位置,实验我们把囚犯定义成对象来实现这个案例会更好
        //2. 创建100囚犯,依次站位,并为其生成编号(1-200之间的随机数,不能重复)
        //3. 循环100次,创建100个犯人,存入集合
        Random random = new Random();
        for (int i = 1; i <= 100; i++) {
            while (true) {
                int code = random.nextInt(200) + 1;
                if (isCanUse(code)) {
                    People p = new People(code, i);
                    peoples.add(p);
                    break;//代表当前囚犯添加成功
                }
            }
        }
        //循环完成,都已经添加成功
        System.out.println("囚犯编号及站位"+peoples);

        //4. 反复删除奇数位置的人,直到剩下一个人为止
        while(peoples.size()>1){
            //干掉奇数位置的人,就是留下偶数位置的人
            List<People> temptPeoples = new ArrayList<>();
            for(int i = 1;i < peoples.size();i+=2){
                People p = peoples.get(i);
                temptPeoples.add(p);
            }
            peoples = temptPeoples;
        }
        System.out.println(peoples);
        People luckPeople = peoples.get(0);
        System.out.println("幸运者站的位置是"+luckPeople.getLocation());

    }

    public static boolean isCanUse(int code) {
        for (People people : peoples) {
            if (people.getCode() == code) {
                return false;
            }
        }
        return true;
    }
}

Test1_1

package com.zhang.demo1;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

/**
 * @Author: ggdpzhk
 * @CreateTime: 2024-10-10
 * 幸存者问题
 */
public class Test1_1 {
    public static List<People> peoples = new ArrayList<>();

    public static void main(String[] args) {
        //1. 先 生成囚犯的队列,因为每个囚犯有 站位 和 编号,因此把囚犯包装成一个对象更好(写好了一个People类,有囚犯的编号和站位)
        //2.随机数生成100囚犯的编号(1-200且不能重复)
        Random random = new Random();
        for(int i = 1;i <= 100;i++){//i从0还是1开始都行,只是一个循环的数字,但是因为后面用i做位置的序号,位置的序号肯定是从1开始嘛,所以就是i= 1
            while (true) {
                int code = random.nextInt(200) + 1;
                if(isCanUse(code)){
                    People p = new People(code,i);
                    peoples.add(p);
                    break;
                }
            }
        }
        //循环完成,已经生成了100个囚犯的编号和站位
        System.out.println("囚犯站位:"+peoples);
        //3. 正   确删除奇数位置的数据,直到只剩下一个
        while (peoples.size()>1){
            for (int i = 0;i < peoples.size(); i++) {
                peoples.remove(i);
            }
        }
        System.out.println(peoples);

        System.out.println("最后一个人的位置是"+peoples.get(0).getLocation());

     /*   peoples.remove(0);
        System.out.println(peoples);
        System.out.println(peoples.get(0));*/
    }

    public static boolean isCanUse(int code){
        for (People people : peoples) {
            if(people.getCode() == code){
                return false;
            }
        }
        return true;
    }
}


Test1和Test1_1的区别

就是在删除奇数位置 直到剩下一个数据 这个方法
在这里插入图片描述

在这里插入图片描述使用偶数或者倒着删的方法能保证位置不动还是怎么,反正不一样,有点印象吧

结果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值