不远远方

圣贤庸行,大人小心

约瑟夫环问题

【题目】

n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人 继续从0开始报数。求胜利者的编号。

【代码】

    //约瑟夫环问题
    public static int Joseph1(int n,int m){
        if(n<=0||m<1){
            return -1;
        }
        List<Integer> list=new ArrayList<Integer>();
        for(int i=0;i<n;i++){
            list.add(i);
        }
        int index=(m-1)%n;//第一个报m-1的人
        while(list.size()>1){
            list.remove(index);//除去报m-1的人
            index=(m-1+index)%list.size();//后面报m-1的人    
        }
        return list.get(0); //最后只剩下一个,即胜利者
    }

    public static int Joseph2(int n,int m){
        if(n<=0||m<1){
            return -1;
        }
        int[] arr=new int[n];
        int count=n;
        int index=-1;
        int step=0;
        while(count>1){
            index++;
            if(index==n){//相当于首尾相连
                index=0;
            }
            if(arr[index]==-1){
                continue;
            }
            step++;
            //报数为m-1的人 出局,重新报数
            if(step==m){
                count--;
                arr[index]=-1;
                step=0;
            }
        }

        for(int i=0;i<arr.length;i++){
            if(arr[i]!=-1){
                //所有出局的人对应数组元素值都为赋值为-1
                index=i;
                break;
            }
        }
        return index;       
    }
阅读更多
个人分类: 每日一练
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

约瑟夫环问题

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭