约瑟环问题【java程序员面试宝典的代码更改】

来源:互联网 发布:和外国人聊天的软件 编辑:程序博客网 时间:2024/05/17 02:33

看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);}}


输出结果为,最后15是我输出计算剩余的人数,正好是15人,满足条件

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表示丢下。



原创粉丝点击