约瑟夫环问题

今天研究了约瑟夫环问题,下面做总结:

首先解释约瑟夫环问题:有一天,国王心情很好,于是从监狱放出40个死囚,并让他们围成一个圈,从第一个人开始报数,报到3的就拖出去处死,然后再由下一个重新报数,如此循环剩下最后一个人,释放,问站在哪一个位置的人可以活着。

解题思路:目前想到的方法有数组,链表集合,递归,下面将用链表集合解决。

首先应该让他们连成环,然后在剔除数到3的人,循环即可,那么怎么让他们连成环呢,我们应该设置两个变量,一个用来做指针,一个用来计数,每当循环完成一遍则把指针归零,继续循环即可,另一个计数则是记录3的倍数,为什么记录三的倍数呢,主要是解决数到三的问题,即每次数到3就可以当成3和他的倍数关系,那么就好处理多了。

public static void main(String[] args) {
        System.out.println(getNum(40,3));
    }
    public static int getNum(int num,int m) {
        List<Integer> list = new ArrayList<>();     //设置链表
        for (int i = 1; i <= num; i++) {            //添加元素到链表
            list.add(i);
        }
        int count = 1;                              //设置计数变量
        for (int i = 0; 1 != list.size(); i++) {    //循环处死,直到剩一个为止
            if (i == list.size()) {                 //每当循环完成一遍,则i置零,继续循环
                i = 0;
            }
            if (count % m == 0) {                    //当数到3的倍数,则删除
                list.remove(i);
                i--;                                 //因为remove的同时会造成后面的数会往前补齐,则指针就会漏掉一个
            }
            count++;                                 //计数
        }
        return list.get(0);                          //因为最后只剩一个所以取第一个即可
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值