您的位置:首页 > 编程语言 > Java开发

约瑟夫环的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;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: