首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java中搜索大型整型数组

在Java中搜索大型整型数组
EN

Stack Overflow用户
提问于 2014-08-25 13:34:04
回答 4查看 504关注 0票数 0

我是编程新手,目前正在学习Java作为我的第一门入门课程。下面是我在过去的一周里一直在努力的一个练习,但我不知道如何去做。有没有人能帮忙?谢谢

您需要编写一个程序,模仿邮递员进行翻转邮箱的实验。

翻转意味着如果邮箱处于关闭状态,则打开邮箱;如果邮箱处于打开状态,则关闭邮箱。

编号为1到100的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个索引。有没有更有效的方法呢?

代码语言:javascript
复制
 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]);
    }
EN

回答 4

Stack Overflow用户

发布于 2014-08-25 14:06:22

因为这是一个赋值,所以我不会为你写任何实际的代码,而是一些pseudo-code

方法:由于要求中只指定邮箱的打开-关闭状态,因此使用boolean (truefalse)数组就可以了。

然后,您可以按以下方式进行翻转:

代码语言:javascript
复制
for i=1 to 100 increment by 1
   flip(mailboxes, i)
end

每一秒的翻转:

代码语言:javascript
复制
for i=2 to 100 increment by 2
   flip(mailboxes, i)
end

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

代码语言:javascript
复制
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函数的职责是将输入布尔数组的值设置为相反的值:

代码语言:javascript
复制
function flip(array, index)
    array[index] = !array[index]
end

如果你喜欢这个想法,这里的文档将在实际实现中对你有所帮助:

  • For loop - for loops
  • Arrays的实际java语法-

的阵列工作原理

票数 1
EN

Stack Overflow用户

发布于 2014-08-25 13:49:05

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

代码语言:javascript
复制
List<MailId> read;
List<MailId> unread;

当用户将邮件翻到已读时,将MailId从未读列表移至已读列表,反之亦然。

票数 0
EN

Stack Overflow用户

发布于 2014-08-25 14:04:51

开始之前,您将需要一个表示邮箱的boolean数组……boolean可以是true (假设是打开的)或false (假设是关闭的)。

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

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

首先仔细看看the Arrays trail,了解更多细节。

接下来,您将需要一些方法来访问每个邮箱,现在有很多方法可以做到这一点,但为了简单起见,您可以使用for-next-loop

代码语言:javascript
复制
for (int index = 0; index < mailBoxes.length; index++) {
    //...
}

有关更多详细信息,请查看The for Statement ...

然后你需要一些方法来改变你访问的每个邮箱的状态,也就是,改变分配的value...again,有多种方法可以做到这一点……

您可以使用if-else语句

代码语言:javascript
复制
if (mailBoxes[index]) { // is true
    mailBoxes[index] = false;
} else {
    mailBoxes[index] = true;
}

或者,您可以更简单地使用! (not)运算符来反转该值……

代码语言:javascript
复制
mailBoxes[index] = !mailBoxes[index];

这只是说mailBoxes[index]不再是现在的mailBoxes[index]了,这将会有一个很好的效果,把true变成false,反之亦然……

现在,复杂的部分是,您将需要使用至少三个for-next循环,所有循环都具有不同的incrementers...this,这就是我建议使用for-next-loop的原因

例如,第二个循环可能类似于...

代码语言:javascript
复制
for (int index = 0; index < mailBoxes.length; index += 2) {

这应该会推动一个正确的方向。

此外,不要忘记使用大量的System.out.println语句来检查发生了什么;)

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

https://stackoverflow.com/questions/25479548

复制
相关文章

相似问题

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