约瑟夫环的java实现
2014-04-10 17:54
435 查看
注释很详细,就不细讲了,上代码。
/** * 10、 有100个人围成一个圈,从1开始报数, * 报到14的这个人就要退出。然后其他人重新 * 开始,从1报数,到14退出。问:最后剩下 * 的是100人中的第几个人? */ public class Test10 { public static void main(String[] args) { Test10 test = new Test10(); int lastP = test.getLastPerson(100, 14); System.out.println("\r\n最后还剩下第"+lastP+"个人。"); } /* * 解题思路,用二维数组模拟一个线性链表,数组第一位存储当前位置,第二位存储该位置的下一位置, * 当到达(报数-1)位置时,则下一位置为要被删除。则将下一位置数组的第二位存储的值赋给当前(报数-1)位置。 * 模拟报数位置删除的过程。依次,直到数组还剩余一个元素。 */ public int getLastPerson(int totalPerson,int outNum){ //根据传入参数,构建一个二维数组 int [][] person = new int[totalPerson][2]; //模拟链表,数组第一位存自己位置,第二位存与之相邻的下一位置 for(int i=0;i<totalPerson;i++){ person[i][0]=i; person[i][1]=i+1; } //将数组最后一位指向数组第一位,模拟一个环形链表 person[totalPerson-1][1]=0; int index=0;//记录每次删除位置的前一位置 System.out.println("出局顺序为:"); //当模拟链表中只剩一个元素,即自己指向自己时,程序退出。 while(index != person[index][1] ){ //模拟一次报数 for(int i=1;i<=outNum;i++){ if(i == (outNum-1)){ //输出出局元素 System.out.print(person[index][1]+1+" "); /* * 到达要删除位置的前一位置(因为如果直接到达删除位置,就要将当前位置的前一位置 * 指向当前位置的后一位置,模拟删除,但是由于是单向链表,前位置取不到,所以到达 * 要删除位置的前一位置比较好处理。) * */ person[index][1] = person[person[index][1]][1]; //记录当前位置 index =person[index][1]; //已删除,则此次报数完成,退出循环 break; } else{ //没到达指定位置,则按步数往后走 index=person[index][1]; } } } //返回下标+1,即第几个人 return index+1; } }
相关文章推荐
- 约瑟夫环--java实现
- 约瑟夫环及其变种算法 java实现
- java实现简单的约瑟夫环问题
- 约瑟夫环(丢手帕游戏)Java 链表实现(程序正确无误)
- Java单链表实现多项式相加、多种方式实现约瑟夫环
- 约瑟夫环的java实现
- JAVA实现约瑟夫环
- java 实现约瑟夫环的实例代码
- java实现斐波那契数列和约瑟夫环
- java实现约瑟夫环问题
- java 约瑟夫环 数组实现 已测试
- 约瑟夫环的JAVA实现
- java实现约瑟夫环
- java链表实现约瑟夫环
- 约瑟夫环 java实现
- Java实现约瑟夫环
- 约瑟夫环java实现的方法
- java单向循环链表实现约瑟夫环
- 约瑟夫环简介,问题以及java实现
- Java语言解决约瑟夫环问题(ArrayList实现)