首页 > 解决方案 > 使用布尔数组的储物柜拼图

问题描述

我不想要答案我想知道我做错了什么。下面是问题

一所学校有 100 个储物柜和 100 名学生。所有储物柜在开学第一天关闭。当学生进入时,第一个学生,记为 S1,打开每个储物柜。然后第二个学生 S2 从第二个储物柜开始,用 L2 表示,然后每隔一个储物柜就关上。学生 S3 从第三个储物柜开始,每隔三个储物柜更换一次(如果它打开则关闭它,如果它关闭则打开它)。学生 S4 从 L4 储物柜开始,每四个储物柜更换一次。学生 S5 从 L5 开始,每五个储物柜更换一次,依此类推,直到学生 S100 更换 L100。

在所有学生都穿过大楼并更换储物柜之后,哪些储物柜是开放的?编写一个程序来找到你的答案。程序应该显示答案

我的代码是

public class LockerPuzzle {

    public static void main(String[] args) {
       
        
        boolean[] lockers = new boolean[100];

        // first all the lockers are closed. false represents closed
        for (int i= 0; i<lockers.length;i++){
            lockers[i]= false;
            System.out.println(lockers[i]);
        }

        // then the first student comme and opens all the lockers
        for (int i = 0; i< lockers.length; i++){
           lockers[i] = true;
        }

       
        int locker = 0;
        for(int j = 1; j<= lockers.length; j++){
            for(int k =j; k< lockers.length; k =k+j){
                if(lockers[k] == false){
                    lockers[k]=true;
                }else{
                    lockers[k]= true;
                }

            }
        }

        // this prints all the open lockers.
        for(int S=0; S<lockers.length; S++)
        {
            if (lockers[S] == true) {
                System.out.println("Locker " + S + " Open");
            }

    }
  }
}

我的输出是说所有储物柜都打开了。

标签: javaarrayspuzzle

解决方案


虽然我同意这个评论,但我仍然认为你会从一些可以减少代码大小的一般提示和指导中受益。

正如@onkarruikar 所指出的,您不必手动初始化您的lockers表。new boolean[100]创建一个所有元素都设置为 的数组false

正如@MathiasRaba 所提到的,您不需要 if/else 块来打开/关闭储物柜。只需将储物柜设置为相反的值。

现在让我们考虑锁定和解锁的实际模拟。i-th 学生从i-th 储物柜开始,然后继续前往i + 1元素之外的储物柜。像这样的东西:

boolean[] lockers = new boolean[100];
for (int i = 0; i < 100; i++) {
    for (int j = i; j < 100; j += i + 1) {
        lockers[j] = !lockers[j];
    }
}

请注意,学生/储物柜的编号从零开始,以便更好地使用数组索引。


推荐阅读