看java面试宝典这本书的时候,发现里面给出许多答案都是错误的,误导了大部分读者,基于约瑟环问题提出的代码,是不符合逻辑,因此进行修正。备注一下,建议还是看java编程思想这类书。
也希望大家批评指导,代码写得不好之处请指出。
约瑟环问题:
/**
* 约瑟环问题。
* 30个人围成一个圈,从第一个开始一次报数,
* 每数到第九人丢出去,剩15。
* Created by ZZ on 2017/11/2.
*/
附上我修改后的代码
public class Ring {
public static void main(String[] args) {
int sum=0;
int[] rings=new int[30];
for(int i=0;i<rings.length;i++){
rings[i]=1;
}
int count=0;
int index=0;
int leftcount=rings.length;
while(leftcount>15){
if(rings[index]==0){
index++;
if(index==rings.length){
index=0;
}
continue;
}
count++;
if(count==9){
count=0;
leftcount--;
rings[index]=0;
}
index++;
if(index==rings.length){
index=0;
}
}
for(int i=0;i<rings.length;i++){
System.out.print(rings[i]+"-");
if(rings[i]==0){
sum++;
}
}
System.out.print(sum);
}
}
1-1-1-1-0-0-0-0-0-1-1-0-1-1-1-0-1-0-0-1-1-0-0-0-1-0-0-1-1-0-15
主要设计思路:
1. 设计一个30个数据的数组,初始值全部设置为1,表示没有人丢下。
2. 用count进行计数,数到9就把对应的值改为0,标示被抛下,同时剩余人数leftcount-1
3. 不同循环,超过上限30人时候,索引值归0
4. 再次循环的时候会碰到之前被设置为0的值,首先进行判断,如果遇到已经被跑下,就跳过,索引往前+1,不参与计数
5. 直到所有人被丢下
6. 最后输出环的位置对应30个人组成的环,1表示留下,0表示丢下。