首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java数组与循环

Java数组与循环
EN

Stack Overflow用户
提问于 2015-06-20 21:50:01
回答 3查看 2.1K关注 0票数 0

有一个灯泡问题,100个人执行一项任务。有人实现了解决此问题的代码:

代码语言:javascript
复制
 boolean[] bulbs = new boolean[100];

 for(int i = 1; i < bulbs.length; i++){//loops through people

我的问题是,这段代码不是只循环了99个人吗?

如果你对最初的问题感兴趣,它是这样的:

在一间长长的房间里,有100个灯泡排成一排。每个灯泡都有自己的开关,目前已关闭。这个房间有一个入口和一个出口门。入口处有100人排队。每个灯泡从1到100连续编号。每个人都是。 一号人进入房间,打开每个灯泡,然后离开。第二人进入并按下开关每秒钟灯泡(关闭灯泡2,4,6.)。3号人进入并按下每三个灯泡上的开关(改变灯泡3、6、9的状态.)。这种情况一直持续到100人都通过了这个房间。 第64号灯泡的最终状态是什么?在第100个人穿过房间后,有多少灯泡被亮了?

另外,如果您感兴趣,代码的全部内容是:

代码语言:javascript
复制
    boolean[] bulbs = new boolean[100];

for(int i = 1; i < bulbs.length; i++){//loops through people
    for(int j = 0; j<bulbs.length;j+=i){//loops through bulbs
        bulbs[j] = !bulbs[j];
    }
}

//print out all the "on" bulbs
for(int i = 1; i<bulbs.length;i++){
    if(bulbs[i]){
        System.out.println(i + ": "+ bulbs[i]);
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-06-20 22:26:52

不,不应该将我初始化为0,因为这意味着在下一条规则中:

代码语言:javascript
复制
for (int j=0; j<bulbs.length;j+=i)

J将无限期地保持在0上。

我确实认为:

代码语言:javascript
复制
 for(int i = 1; i < bulbs.length; i++)

应成为:

代码语言:javascript
复制
 for(int i = 1; i <= bulbs.length; i++)

所以它实际上从1循环到100,而不是1-99。

至于最后一部分:第64号灯泡的最终状态是什么?在第100个人穿过房间后,有多少灯泡被亮了?

代码语言:javascript
复制
System.out.println("State bulb 64: " + bulbs[63]); // if we assume bulbs[0] is considered as bulb number 1
int count = 0; 
for (int i=0; i<bulbs.length; i++) {
    if (bulbs[i]) 
        count++;
}
System.out.println("# lightbulbs on:" + count);
票数 1
EN

Stack Overflow用户

发布于 2015-06-20 21:52:06

是。应该将i初始化为零,而不是一个,以循环整个数组。

票数 4
EN

Stack Overflow用户

发布于 2015-06-20 23:51:21

您的问题产生于这样一个事实:您的人员和灯泡从1向上编号,但是数组从0向上索引。

1简单的解决方案可能是创建一个由101个索引组成的数组,而不使用第一个索引(将其设置为false,这样灯泡就永远不会被激活,并且不会影响最终激活灯泡数量的结果)。

或者,您可以保留由100个索引组成的数组,并在每次寻址某个人或一个灯泡时,在索引和人员/灯泡号之间进行转换。守则将成为:

代码语言:javascript
复制
for (int i = 0; i < bulbs.length; i++)
    for (int j = i; j < bulbs.length; j = j + i + 1)
        bulbs[j] = !bulbs[j];

这样:-所有100人都进入房间(第一圈)-灯泡上方的回路按人的数字步进(例如,人nr 1有索引O,所以"j =j+i+ 1“在每一步中增加1,人2有索引1,所以"j =j+i+ 1”在每一步中增加j 2,等等)

注:灯泡上的循环必须从"i“开始,而不是从" 0”开始,否则每个人将切换第一个灯泡,然后每个n个灯泡(例如,person 2将切换索引0、2、4、.它们是灯泡nr 1,3,5等,由于人/灯泡编号和索引之间的差异),用我的代码,person 1(索引0)将切换所有灯泡-- person 2(索引1)将切换索引1,3,5,.那是灯泡2,4,6,..

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30959230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档