前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >约瑟夫问题

约瑟夫问题

作者头像
名字是乱打的
发布2021-12-22 14:58:20
3330
发布2021-12-22 14:58:20
举报
文章被收录于专栏:软件工程

题目:约瑟夫问题是一个非常著名的趣题,即由n个人坐成一圈,按顺时针由1开始给他们编号。然后由第一个人开始报数,数到m的人出局。现在需要求的是最后一个出局的人的编号。

给定两个int nm,代表游戏的人数。请返回最后一个出局的人的编号。 保证n和m小于等于1000。

注意:

这里判断新的起始位置时候需要用当前位置重新对链表长度取余得方式,因为这里不确定是否需要从头开始 测试样例: 输入5 3 返回 4

思想:

数学方法判断取出数据得位置: getIndex=(curr+m-1)%len.size();从当前位置开始,取出第m个元素.

一个小解答

为什么这里计算删除元素在链表位置时候要加m-1而不是直接m呢?? 因为,链表中 1代表0号位置啊.......是不是很傻逼得回答,实际上我之前还真迷了一会

代码:

代码语言:javascript
复制
public int joseph(int n, int m) {
        if (n <= 0||m<=0) {
            return -1;
        }
        LinkedList<Integer> list = new LinkedList<>();//数据链
        for (int i = 1; i <= n; i++) {
            list.add(i);
        }//添数据(小朋友编号)

        int index=0;//从链表0位置开始数 m个元素
        
        while (list.size()>1){//只要不是剩最后一个元素就要去数据
            int delIndex=(index+m-1)%list.size();//计算删除位置
            list.remove(delIndex);//移除
            index=(delIndex)%list.size();
            //新得起始报数位置,如果delindex删除得不是最后一个元素,其实这里delIndex还是新得起点
            // 但是如过它是最后一个元素,那么它得起点应该是第一个元素
            //这里就直接用取余操作了
        }
        
        return list.peek();
    }
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/12/14 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 注意:
  • 思想:
    • 一个小解答
    • 代码:
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档