约瑟夫问题(java实现)

约瑟夫问题(有时也称为约瑟夫斯置换,是一个出现在计算机科学和数学中的问题。在计算机编程的算法中,类似问题又称为约瑟夫环。又称“丢手绢问题”.)在下面的代码中,解决的是n个人排成一圈,这n个人的序号分别是0 ~ n-1, 给定一个数m,从头开始报数,每报到m-1时,这个人出列,然后下个人从0开始报数,直到最后一个人留下,求最后一个人的序号。java实现代码如下:
 

public class YueSeFu {

    public static void main(String[] args) {

        int a = test(3,1);
        System.out.println(a);
    }

    public static int test(int n,int m){

        if(n==0 || m==0){
            return -1;
        }

        if(n==1 && m==1){
            return -1;
        }

        List<Integer> list = new ArrayList<>();
        for(int i=0;i<n;i++){
            list.add(i);
        }

        int index = -1;
        while (list.size()>1){

            index = (index + m) % list.size();
            /**
             * 同样的,用动态数组存储数据,一个大循环就是数组不为空;
             * 用 i 记录已走过的整个数组下标的最后一位(关于这句话,大家可能不太理解,
             * 意思就是比如数组[1,2,3,4,5,6],当遍历到元素4时,下标为3,然后把4移除,
             * 下标自减,让其改为2,指向元素3,而不是指向还未遍历到的元素5);
             * 以count计数,到第k个就删去该元素,并且置count=0,i-- 使得下标回退一步。
             * index--的意思就是退回到3的位置
             */
            list.remove(index);
            index--;
        }

        return list.get(0);

    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值