j使用数组实现约瑟夫环 java

我们首先来看一下约瑟夫环问题:

    给定m个人,m个人围成一圈,在给定一个数n,从m个人中的第一个人每第n个人便将其除去,求被最后一个出去的人的编号。

    思路:

       建立一个长度为m+1的数组,将其的内容初始化为0至m

我们设置变量i与j,i代表数组元素的下表,因为我设置的数组长度为m+1,所以数组下标就为每个人的编号,当i==m的时候,我们将i置为0,让其从头开始便利。

变量j为判断当前元素是否为排列的第n个元素,如果是则将当前下标为i的元素的值置为0,不是的话,i++,j++,每当我们遍历到数值为0的元素时,continue,i++,不进行其他操作。

具体代码如下:

import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner scanner = new Scanner(System.in);
		int m=scanner.nextInt();                      //读取m的值
		int n = scanner.nextInt();                    //读取n的值
		int[] a = new int[m+1];                       //设置一个长度为m+1的数组
		
		for(int i=0;i<=m;i++) {                       //初始化数组,将数组的值与其下标一一对应,易懂方便操作
			a[i]=i;
		}
		
		/*
		 * 设置变量i与j
		 * i为判断下标即为元素值
		 * j为判断n的元素,如果==n即将当前i的元素除去
		 */
		int i=0,j=1;                                 
		boolean flag=false;//设置一个标志变量,在循环中用于break以及continue
		
		while(true) {
			
			i++;               //一轮循环进行一次下表后移
			flag=false;        //将标志变量设置为false
			if(a[i]==0) {      //如果当前下标中的值为0,即跳过
				flag=true; 
				if(i==m)		//判断此时的i是否==m,若果等于m则让其重置为0
					i=0;
			}
			
			if(flag)            //对应上面的函数
				continue;
			
			if(j==n) {          //如果j==n了
				if(PanDuan(a)) {            //判断此时数组中是否只有一个非零元素,如果是则当前找到的元素为最后一个元素,否则执行else
					System.out.println(i);
					flag=true;              //因为找到了最后一个元素,则设置标志变量为true
				}
				else {                      //只满足j==n,不满足其为最后一个元素,则让当前元素的内容置为0,且让j=0,开始新的计数
					a[i]=0;
					j=0;
				}
				
			}
			
			if(flag)                        //找到了最后一个元素,跳出循环
				break;
			
			if(i==m)                       //如果i==m,则让i=0
				i=0;
			
			j++;                           //一轮循环,j++
			
			
		}
	}
	
	static boolean PanDuan(int [] a) {  //判断给定数组中石否只有一个非零元素
		int count =0;
		for(int i=0;i<a.length;i++) {
			if(a[i]!=0)
				count++;
		}
		
		if(count==1)
			return true;
		return false;
	}

}

 此方法为数组解决,比起用集合麻烦,但是适用于还没有学习集合api的小伙伴们。有更简单的方法可以跟我交流哦~

猜你喜欢

转载自www.cnblogs.com/beaut-program/p/9074424.html