【问题标题】:Post increments发布增量
【发布时间】:2019-10-31 16:57:46
【问题描述】:

我一直在查看我在 java 中的旧工作,在互联网上寻找答案,但我找不到我需要的东西。我有一个有序数组,将值输入到方法 countOccurence(int [] list) 中。我了解阵列的工作原理,但我的问题是; 数组如何在不创建重复项的情况下移动到下一个数字。

数组如何能够跳过重复项并一直移动到最后而不单独遍历所有重复项。

这里是代码。

public static void Calculations(){
    Scanner in = new Scanner(System.in);
    int[] values = {1, 2, 2, 2, 2, 3};

    countOccurence(values);
}

public static void countOccurence(int[] list) {
    //12 23 45 56 56 0
    for (int i = 0; i < list.length; i++) {
        int count = 0;
        for (int j = 0; j < list.length ; j++) {
            if (list[j] == i)
                count += 1
        }
        if (count != 0)
            System.out.printf("%d happens %d %s%n",
                    i, count, count > 1 ? "times" : "time");
    }
}

}

【问题讨论】:

  • 这个程序真的给你出现的次数吗?不应该是if (list[j] == list[i])吗?
  • 这不是解决问题的最佳方式,因为结果会是这样。 0 次出现 1 次 1 次出现 4 次 2 次出现 4 次 3 次出现 4 次 4 次出现 4 次 5 次出现 1 次
  • 这是通常需要的结果 1 出现 1 次 2 出现 4 次 3 出现 1 次
  • 我真正需要知道的是,阵列如何智能到不计算其他 2 并直接跳到 i=3。它在一次迭代中用 -j- 遍历了 2,然后跳转到 -i- (5)
  • 根据你关于使用list[j]==i而不是list[j]==list[i]的解释,那你为什么要使用外循环呢?如果您的想法是检查所有数字,那么外部循环退出条件i&lt;list.length 不正确吗?不应该是i&lt;maxValueInArray之类的吗?

标签: arrays increment


【解决方案1】:

让我们看看这里发生了什么,我相信这是合乎逻辑的 我们将在这个答案的最后讨论这个缺陷。 :)

public static void Calculations(){
    Scanner in = new Scanner(System.in);
    int[] values = {1, 2, 2, 3}; 
    //reducing few 2s to make the explanation shorter
    countOccurence(values);
}

    public static void countOccurence(int[] list) {
        //12 23 45 56 56 0
        for (int i = 0; i < list.length; i++) {
            int count = 0;
            for (int j = 0; j < list.length ; j++) {
                if (list[j] == i)
                    count += 1
            }
            if (count != 0)
                System.out.printf("%d happens %d %s%n",
                        i, count, count > 1 ? "times" : "time");
        }
    }
    }

它是这样的:注意,我考虑过保留这个数组 简而言之:int[] values = {1, 2, 2, 3};

Outer-loop iteration 1: i=0
     Inner-loop iteration 1: j=0, list[j]=list[0]=1!=(i=0), count=0
     Inner-loop iteration 2: j=1, list[j]=list[0]=2!=(i=0), count=0
     Inner-loop iteration 3: j=2, list[j]=list[0]=2!=(i=0), count=0
     Inner-loop iteration 4: j=3, list[j]=list[0]=3!=(i=0), count=0
     Print count 0

count=0 again
Outer-loop iteration 2: i=1
     Inner-loop iteration 1: j=0, list[j]=list[0]=1=(i=1), count=1
     Inner-loop iteration 2: j=1, list[j]=list[0]=2!=(i=1), count=1
     Inner-loop iteration 3: j=2, list[j]=list[0]=2!=(i=1), count=1
     Inner-loop iteration 4: j=3, list[j]=list[0]=3!=(i=1), count=1
     Print count 1

count=0 again
Outer-loop iteration 3: i=2
     Inner-loop iteration 1: j=0, list[j]=list[0]=1!=(i=2), count=0
     Inner-loop iteration 2: j=1, list[j]=list[0]=2=(i=2), count=1
     Inner-loop iteration 3: j=2, list[j]=list[0]=2=(i=2), count=2
     Inner-loop iteration 4: j=3, list[j]=list[0]=3!=(i=2), count=2
     Print count 2

count=0 again
Outer-loop iteration 4: i=3
     Inner-loop iteration 1: j=0, list[j]=list[0]=1!=(i=3), count=0
     Inner-loop iteration 2: j=1, list[j]=list[0]=2!=(i=3), count=0
     Inner-loop iteration 3: j=2, list[j]=list[0]=2!=(i=3), count=0
     Inner-loop iteration 4: j=3, list[j]=list[0]=3=(i=3, count=1
     Print count 1

i=4 现在i&lt;list.length 即4&lt;4 不正确,所以它退出外循环,我们就完成了。所以,这就是它的工作原理。这里没有跳过元素。你不断增加i 的值,所以i 永远不会重复。所以它永远不会打印重复元素的计数。它仍然像应有的那样迭代数组(在内部循环中)。只是i=2 永远不会再发生,或者当i has incremented to 3 不会再发生,所以list[j]==i for i=2 不会发生不止一次。

现在,这个实现的问题或缺陷在哪里? 只要数组中的元素或数字小于数组本身的长度,此实现就可以工作。

如果原始数组类似于{1,2,2,4},则检查4 的出现, i 必须增加到 4 但数组长度也是 4 等 i&lt;list.length 即 4&lt;4 永远不会为真,因此 4 或 any number greater than 4 的出现次数不会被检查。所以只要数组中的元素小于数组本身的长度,这个实现就可以完美地工作。

要更正您的实现,您最初可能必须运行一个单独的循环以获取数组中的最大数字,然后将条件更改为 i&lt;=largestNumber。

【讨论】:

  • 我了解数组的大小和限制,我关心的是:'外循环迭代 2:i=1' 和这里的'外循环迭代 3:i=2'跨度>
  • 你还有疑问吗?
  • 到目前为止我得到了答案,我怀疑为什么结果看起来不是这样 i=1 等于 j=0 并且 i =2 等于 j = 1, j= 2 count = 2 和i = 3 等于 j= 1,j =2 count = 2 并且 i = 4 等于 j = 3
  • 为什么要在外循环中添加迭代i2和i3的迭代?那是我迷路的地方
  • 对于外循环的每次迭代,j 将完成 4 次迭代。这是因为j 每次都重置为0。所以它会从j=0 开始运行外循环的每次迭代,一直到j=3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多