在Java中搜索大型int数组

时间:2014-08-25 05:34:04

标签: java arrays

我是编程新手,目前正在将Java作为我的第一门入门课程。以下是我过去一周一直在努力的练习,但无法弄清楚如何去做。有人可以帮忙吗?感谢

您被要求编写一个程序,模仿邮递员在翻转邮箱时进行实验。

翻转意味着在邮箱关闭时打开邮箱,并在邮箱打开时关闭邮箱。

有100个编号为1到100的邮箱最初都已关闭。在第一步中,访问每个邮箱(即邮箱1,2,3,...,100),他将所有邮箱翻转。然后在第二步中,访问每个第二个邮箱(即邮箱2,4,6,...,100),他翻转它们。然后在第三步中,访问每个第三个邮箱(即邮箱3,6,9,...,99),他翻转它们。以这种方式,他按步骤4,5,...,10,...,50,最后是100,其中他直接进入第100个邮箱并翻转它。

在此过程结束时,哪些邮箱已打开?提示:设置一个布尔数组,所有布尔值都初始化为false,表示已关闭的邮箱。然后,以1,2,3,...,100的步长完成邮箱序列并切换它们。最后,打印出打开的邮箱号码(值为true)。

大家好, 万分感谢您的指导。以下是我能够做到的。不幸的是,我意识到如果我继续这样,我可能不得不重复这个过程到第99个索引。有没有更有效的方法呢?

 public class Assignment {
    public static void main(String[] args) {
    int index;
    boolean mailBoxes[] = new boolean[100];

    //flip each mailbox

    for(index=0; index<mailBoxes.length;index++){
    mailBoxes[index] = !mailBoxes[index];
    System.out.println(mailBoxes[index]);
    }

    for(index=1; index<mailBoxes.length;index+=2){
    mailBoxes[index] = !mailBoxes[index];
    System.out.println(mailBoxes[index]);
    }

    for(index=2; index<mailBoxes.length;index+=3){
    mailBoxes[index] = !mailBoxes[index];
    System.out.println(mailBoxes[index]);
    }

4 个答案:

答案 0 :(得分:1)

由于它是一项作业,我不会为您编写任何实际代码,但有些pseudo-code

我该怎么做:由于要求没有指定其他任何内容,而不是邮箱的开闭状态,booleantruefalse)数组会很好。

然后你可以按照以下方式进行翻转:

for i=1 to 100 increment by 1
   flip(mailboxes, i)
end

每一秒的翻转:

for i=2 to 100 increment by 2
   flip(mailboxes, i)
end

所以你不妨做每一个,第二个,第三个...在另一个循环中翻转:

for j=1 to 4 increment by 1
    for i=j to 100 increment by j
        flip(mailboxes, i)
    end
end

外部循环将来自1 to 4,内部循环可以使用j作为迭代的开始以及增量值。

flip函数的职责是将输入布尔数组的值设置为相反的:

function flip(array, index)
    array[index] = !array[index]
end

如果您喜欢这个想法,以下是可以帮助您实际实施的文档:

答案 1 :(得分:0)

您可以尝试使用两个列表来跟踪邮件状态。

List<MailId> read;
List<MailId> unread;

当用户翻阅邮件进行阅读时,将MailId从未读移动到阅读列表,反之亦然。

答案 2 :(得分:0)

要尝试让您入门,您需要一个代表邮箱的boolean数组...... booleantrue(让我们说开放)或false(让我们说关闭)。

boolean[] mailBoxes = new boolean[100];

关于这个的好处是,数组中的所有元素都自动设置为false

首先仔细查看the Arrays trail了解更多详情。

接下来,您需要某种方式访问​​每个邮箱,现在,您可以通过多种方式执行此操作,但为简单起见,您可以使用for-next-loop

for (int index = 0; index < mailBoxes.length; index++) {
    //...
}

请查看The for Statement了解更多详情......

然后,您需要一些方法来更改每个邮箱的状态,即更改指定的值...再次,有多种方法可以执行此操作...

您可以使用if-else声明

if (mailBoxes[index]) { // is true
    mailBoxes[index] = false;
} else {
    mailBoxes[index] = true;
}

或者,您可以更简单地使用!(非)运算符翻转值...

mailBoxes[index] = !mailBoxes[index];

这只是说mailBoxes[index]目前不是mailBoxes[index],这会将true变为false,反之亦然......

现在,复杂的部分是,您需要使用至少三个for-next循环,所有循环都有不同的增量...这就是为什么我建议for-next-loop

例如,第二个循环可能看起来像......

for (int index = 0; index < mailBoxes.length; index += 2) {

这应该推动正确的方向......

另外,不要忘记使用大量System.out.println语句来查看正在进行的操作;)

答案 3 :(得分:0)

如上所述,大部分解决方案已经暗示过了。

//You can use just an array of boolean (which by default inits to false):
boolean[] b = new boolean[100];

//then insert loop for steps (which are incremented from 1 to 50 as it seems)
for (int step=1;step<=50;step++){
     //then loop over array elements using current step
     for(int j=0;j<b.length;j+=step){
         //flip mailbox using 'not' operator
         b[j]=!b[j];
     }
     //you can also print results to System.out to debug
}

请注意,非标准步数= 100(仅翻转最后一次),您可以手动执行此操作。

如果您是java新手,请注意从零开始的索引,即第一个邮箱实际上是b [0](如果您将使用ArrayList,则为boxes.get(0))。 此外,以某种方式修改代码(超出任务要求)以更好地理解更精细的细节也是一件好事。