Java版-经典算法“约瑟夫环问题”(企业高频笔试算法题)

经典算法-约瑟夫环问题(初级版)
直接上经典的例题:
案例1:
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列(也类似于变态杀人狂问题)。通常解决这类问题时我们把编号从0~n-1,最后结果+1即为原问题的解。求最后一个出列人的编号问题。

常见的解法有三种:数组,链表和递归。

为了方便理解和备战企业笔试,本文给出此算法的Java解题模板,采用列表(ArrayList)数据结构。

package yuesefuhuan;

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

public class Main{
    public static void main(String[] args) {
    	Scanner sc = new Scanner(System.in);
    	int n=sc.nextInt();//初始化约瑟夫环的总人数
    	int m=sc.nextInt();//报数为m的人出列
        List<Integer> circleQueque = new ArrayList<Integer>();
        //初始化约瑟夫环,用列表进行保存
        for (int i = 0; i < n; i++) { 
            circleQueque.add(i + 1);
        }
        int start = 0; //记录开始报数的位置
        //当约瑟夫环中剩余人数为1时,循环终止
        while (circleQueque.size() >1) {  
        	//记录当前出队人的位置         
            int curPopIndex = (start + m - 1) % circleQueque.size();    
            //达到出队报数条件的人进行出队,同时列表会自动调整索引
            circleQueque.remove(curPopIndex);    
            start = curPopIndex;
        }
		System.out.print("最后出队人的编号:"+circleQueque.get(0));
    }
}

经典算法-约瑟夫环(变种版)
案例2:
已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为1的人开始报数,依次间隔m=1,2,3…(注意是间隔)的那个人出列,求最后一个人出列的编号。

注意!!!这里的m不再是一个固定值,而是一个等差数列。

package yuesefuhuan;

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

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int start = 0;
        int m = 1;
        List<Integer> circleQueque = new ArrayList<>();
        //初始化约瑟夫环
        for(int i = 1 ;i <n; i++){
            circleQueque.add(i+1);
        }
        while(circleQueque.size()>1){
            //当前出列元素的位置,因为是间隔,所以(start+m)不用减1
            int curPopIndex = (start+m)%circleQueque.size();
            circleQueque.remove(curPopIndex);
            //m进行递增操作
            m++;
            //求下一次开始报数的值在新环中的位置
            start = curPopIndex;
        }
        System.out.println("最后出列人的编号:"+circleQueque.get(0));
    }
}

你可能感兴趣的:(算法)