2020-03-30(62 圆圈中最后剩下的数字)

这道题比较简单,看题目能够想到的是循环链表,不过java中没有对应的组件,如果要用循环列表的话需要自己实现一个。懒得花这个时间,就用list模拟了。因为涉及到要移除元素,我使用了ArrayList,后来看到评论说用其他组件有超时的问题。不过即使用了这个ArrayList,耗时也不是很理想,还有一种数学推导方法,不是很好理解,但是比较简洁轻便。

方法一:用ArrayList模拟

    ArrayList<Integer> mList =  new ArrayList<Integer>();
    public int lastRemaining(int n, int m) {
        initialList(n);
        if(n < 1 || m < 1){
            return -1;
        }
        return getLastNum(m);
    }

    public int getLastNum(int m){
        int cur = m - 1;
        while(mList.size() > 1){
            int size = mList.size();
            if(cur > size - 1){
                cur = cur % size;
            }
            mList.remove(cur);
            cur += m - 1;
        }
        if(mList.size() > 0){
            return mList.get(0);
        }else{
            return -1;
        }
    }

    public void initialList(int n){
        for(int i = 0; i < n; i++){
            mList.add(Integer.valueOf(i));
        }
    }

方法二:数学推导,约瑟夫环
假设 n = 5, m = 3,列出元素的删除过程
index=0 : 0 1 2 3 4
index=1 : 3 4 0 1 | 3 4 0 1
index=2 : 1 3 4 | 1 3 4
index=3 : 1 3 | 1 3
index=4 : 3
从下往上进行倒推:
k=1 -----> f(1) = 0;
k=2 -----> f(2) = (0 + 3) % 2 = 1;
k=3 -----> f(3) = (1 + 3) % 3 = 1;
k=4 -----> f(4) = (1 + 3) % 4 = 0;
……
……
k = n ------> f(n) = (f(n-1) + m) % n
具体实现如下

public int lastRemaining(int n, int m) {
        if(n < 1 || m < 1){
            return -1;
        }
        int result = 0;
        for(int k = 2; k < n + 1; k++){
            result = (result + m) % k;
        }
        return result;
    }
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,230评论 0赞 2
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 4,195评论 0赞 2
  • 题目 题目:有n个人,围成一个环,编号为 0、1、2、3、、、n-1,从第一个人开始循环报数(从1开始),假设数到...
    StormZhu阅读 886评论 0赞 1
  • ——读日本国宝级摄影家星野道夫《在漫长的旅途中》有感。 "人的一生,总是为了追寻生命中的光,而走在漫长的旅途上。"...
    简玦阅读 2,591评论 63赞 71
  • 假期在去日照体检的路上,听见孙老师在说做水煎包。我非常钦佩她的手艺,于是就诚恳的向她了解制作过程,心想等有...
    风轻云淡lzm阅读 572评论 3赞 13

友情链接更多精彩内容