约瑟夫环问题java实现

约瑟夫环问题描述(改了一下背景,题目思想一致):
编号为1,2,3...n的人一词围成一圈,从第k个人开始报数(从1开始),数到m的人退出。接着下一个人又从1开始报数,数到m的人退出,以此类推。问:剩下的人的编号是多少?

样例1

输入

8

3

1

输出

7

样例2

输入

6

3

1

输出

1

import java.util.ArrayList;
import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        int n,m,k;
        Scanner scan=new Scanner(System.in);
        n=scan.nextInt();
        m=scan.nextInt();
        k=scan.nextInt();
        System.out.println(josephus_problem(n,m,k));
    }

    public static int josephus_problem(int num,int m,int k) {
        ArrayList list = new ArrayList<>();
        for(int i = 1; i <= num; i++) {
            list.add(i);
        }
        int count = k;
        for(int i = 0; list.size() != 1; i++) {				//只要集合中人数超过1,就要不断的退出
            if(i == list.size()) {							//如果i增长到集合最大的索引+1时
                i = 0;										//重新归零
            }
            if(count % m == 0) {
                list.remove(i--);
            }
            count++;
        }
        return list.get(0);
    }
}

 

你可能感兴趣的:(java,Java学习之路)