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的小伙伴们。有更简单的方法可以跟我交流哦~

原文地址:https://www.cnblogs.com/beaut-program/p/9074424.html

时间: 2024-10-05 09:40:05

j使用数组实现约瑟夫环 java的相关文章

约瑟夫环 java实现

问题: N个人从1到N编号,围城一圈,从1开始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再开始报数,直到所有人都出去 思路: 就是计数,移除,没有太深的思想,直接上代码: package test; import java.util.ArrayList; import java.util.List; import java.util.Scanner; /** * N个人从1到N编号,围城一圈, * 从1开始报数, 数到X时,将X的编号输出,并将那个人踢出, * 下一个从1再开

C语言用数组解决约瑟夫环问题

       在罗马人占领乔塔帕特后,39 个犹太人与约瑟夫及他的朋友躲到一个洞中,大家决定宁愿自杀也不要被敌人抓到,于是确定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须自杀,然后再由下一个重新报数,直到所有人都自杀身亡为止.然而约瑟夫和他的朋友并不想死去,那么他应该怎样安排他和他的朋友的位置,才能逃脱这场死亡游戏呢?         用C语言解决约瑟夫环问题的最佳方式是采用循环链表,但使用数组同样也可以解决瑟夫环的问题.采用循环链表的方法,以后详述.本节主

C语言数组实现约瑟夫环问题,以及对其进行时间复杂度分析

尝试表达 本人试着去表达约瑟夫环问题:一群人围成一个圈,作这样的一个游戏,选定一个人作起点以及数数的方向,这个人先数1,到下一个人数2,直到数到游戏规则约定那个数的人,比如是3,数到3的那个人就离开这个游戏:按这样的规则,剩下一个人,游戏就结束,这个人就为赢家.(读者可以试着表达,不认同,直接忽略) 抽象分析 这个人就是一个数据个体,数据结点,数据元素.上面产生的数据结构为:单方向循环的链.可以用链表实现,也可以用数组来实现. 链表到数组的迁移 人(数据元素. 数据结点.数据个体) 结点关系 (

分别使用结构体和数组实现约瑟夫环(围圈报数问题之二)

前天用单循环链表实现了约瑟夫环问题,这种方法执行效率高.接下来用另外两种简单的方法实现之. 方法一:使用数组 void main() { int a[81],n,i,counter,num; //counter用来计算,num用来记录退出的人数 printf("please input total the number of person:"); scanf("%d",&n); for(i=0;i<n;i++) //为每个人编号,1~n { a[i]=

约瑟夫环 java 对象数组实现

import java.util.Scanner; class Person{ String name; int seqno; Person(String _name, int _seqno){ name = _name; seqno = _seqno; } } public class JosephCircle { public static void main(String[] args) { // TODO Auto-generated method stub Scanner scanne

约瑟夫环问题-Java数组解决

约瑟夫环问题说的是,n个人围成一圈,从第k个人开始沿着一个方向报数,报到第m个人时,第m个人出列,从紧挨着的下一个人(未出列)开始,求整个环中人的出列顺序.下面是我用java实现的解决方法. 1 class JosephLoop 2 { //n为环中人数,m为每次报数的人数,k为报数的起始位置0-n 3 int n,m,k; 4 int[] persons; 5 int[] seq; 6 7 JosephLoop(int n, int k, int m){ 8 this.n = n; 9 thi

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

约瑟夫环的C语言数组实现

约瑟夫环问题的具体描述是:设有编号为1,2,--,n的n个(n>0)个人围成一个圈,从第1个人开始报数,报到m时停止报数,报m的人出圈,才从他的下一个人起重新报数,报到m时停止报数,报m的出圈,--,如此下去,知道剩余1个人为止.当任意给定n和m后,设计算法求n个人出圈的次序. 一开始看到这这个题目就是觉得这是一个环形的,想到了用链表和用指针,然后看题目的要求是使用数组实现.就先暂时放弃用链表的办法,用数组实现之后再用链表来实现. 一开始的思路是: 1.建立一个长度为n的数组. 2.取出位置编号

约瑟夫环问题——初步了解+数组实现

约瑟夫环问题--初步了解+数组实现 一开始接触约瑟夫环问题,还是在C语言的书中,具体的题目如下:n个人围坐成一圈,选某个人开始(比如第1个),从1开始报数,沿着顺时针方向数到m的人被淘汰,然后后面一个人继续再从1开始报数,数到m时再淘汰一人.重复上面的过程,输出剩下的最后一个人. 解题思路: Step 1:建立一个长度为n的数组: Step 2:删除的位置编号为i = (i + m -1) % n; 为什么呢?因为第一个人事i = 0,然后 i 增加m-1即可删除另外一个人,把数组想象成一个"环