JAVA-牛客-约瑟夫问题

12 篇文章 0 订阅

1.题目

题目描述
现有n个人围坐一圈,顺时针给大家编号,第一个人编号为1,然后顺时针开始报数。第一轮依次报1,2,1,2…没报1的人出局。接着第二轮再从上一轮最后一个报数的人开始依次报1,2,3,1,2,3…没报1的人都出局。以此类推直到剩下以后一个人。现给定一个int n,要求返回最后一个人的编号。

测试样例:
5
返回:5

2.分析

此问题需要将数据构成环,
因此在这里采用链表存储每次没有出局的人
我们首先将1-5号依次放入链表,根据题目要求,需要进行1,2报数,且报数为1的不淘汰,那么通过判断条件将报数为1的加入
2号链表,通过2号链表来保存进入下一轮的人员名单
之后再去判断2号链表即可

代码示例

public class Joseph {
    
        
    public int getResult(int n) {
        LinkedList<Integer> ret = new LinkedList();
        for (int i = 1; i <= n; i++) {
            ret.addLast(i);
        }
        int m = 2;
        int tmp = 0;
        int j = 1;
        LinkedList<Integer> ret1 = new LinkedList();
        LinkedList<Integer> ret2 = new LinkedList();
        while (ret.size() != 1) {
            for (; j <= ret.size(); j++) {
                if (j % m == 1) {
                    ret1.addLast(ret.get(j-1));

                }
            }
            tmp = ret1.getLast();
            ret1.removeLast();
            ret1.addFirst(tmp);
            ret2 = (LinkedList<Integer>) ret1.clone();
            ret1.clear();
            ret=ret2;
            m+=1;
            j=1;
        }
        return ret.getFirst();
    }

}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值