首页 > 解决方案 > 如何循环遍历每个数组项并除以二?

问题描述

一个数组居民代表城市及其各自的人口。例如,以下数组显示了 8 个城市及其各自的人口:

[3, 6, 0, 4, 3, 2, 7, 1]

由于正在消灭人类生命的大流行僵尸病,一些城市的人口为 0。每过一天,每个城市都会失去一半的人口。编写一个程序来循环每个城市的人口,让它失去一半的人口,直到所有城市都没有人。对数组中的每个元素进行更新并每天打印如下数组:

Day 0 [3, 6, 0, 4, 3, 2, 7, 1]
Day 1 [1, 3, 0, 2, 1, 1, 3, 0]
Day 2 [0, 1, 0, 1, 0, 0, 1, 0]
Day 3 [0, 0, 0, 0, 0, 0, 0, 0]
---- EXTINCT ----

问题是当我输入 [3, 6, 0, 4, 3, 2, 7, 1] 时,它给了我两个带零的额外数组行;

Day 0 [3, 6, 0, 4, 3, 2, 7, 1]
Day 1 [1, 3, 0, 2, 1, 1, 3, 0]
Day 2 [0, 1, 0, 1, 0, 0, 1, 0]
Day 3 [0, 0, 0, 0, 0, 0, 0, 0]
Day 4 [0, 0, 0, 0, 0, 0, 0, 0]
Day 5 [0, 0, 0, 0, 0, 0, 0, 0]
---- EXTINCT ----

当我在我的 for 循环中尝试resident.length-2时,它可以工作,但是当输入不同时,它会产生另一个问题,例如;

20
20
0
20
20
10
0
10

这是我的代码;

import java.util.*;

class Main {
  public static void main(String[] args) {

    Scanner input = new Scanner(System.in);
    int[] inhabitants = new int[8];

    for(int i=0; i<inhabitants.length; i++) {
        inhabitants[i] = input.nextInt();
    }

    int day = 0;
    System.out.println("Day " + day + " "+ Arrays.toString(inhabitants));
    for (int i = inhabitants.length/2; i <= inhabitants.length-2; i++) {
        for (int j =0; j < inhabitants.length; j++) {
            inhabitants[j] /= 2;
        }
        day++;
        System.out.println("Day " + day + " "+ Arrays.toString(inhabitants));
    }

    System.out.println("---- EXTINCT ----");
  }
}

标签: javaarraysloops

解决方案


您的外循环条件应该是inhabitants不完全用零填充。就像是,

int day = 0;
System.out.println("Day " + day + " " + Arrays.toString(inhabitants));
while (!Arrays.stream(inhabitants).allMatch(x -> x == 0)) {
    day++;
    for (int i = 0; i < inhabitants.length; i++) {
        inhabitants[i] /= 2;
    }
    System.out.println("Day " + day + " " + Arrays.toString(inhabitants));
}
System.out.println("---- EXTINCT ----");

推荐阅读