【问题标题】:Get missing number from int array with Java streams使用 Java 流从 int 数组中获取缺失的数字
【发布时间】:2020-04-23 10:29:39
【问题描述】:

我有以下数组,

int [] a = {5,3,10,8,4,2,9,6};

我正在尝试从 tha 数组中获取丢失的数字,

private static int getMissingNumber(int[] a) {
    int expectedSum = IntStream.rangeClosed(1, 10)
            .reduce(0, Integer::sum);
    int actualSum = Arrays.stream(a).reduce(0, Integer::sum);

    return expectedSum-actualSum;
}

但是得到的是 8 而不是 7。我在这里缺少什么?

【问题讨论】:

  • {5,3,10,8,4,2,9,1}; 的预期输出是什么?
  • 我正在检查单个丢失的号码。这里缺少两个数字。
  • 当然,但不应该假设输入总是正确的,不是吗? (特别是当它没有排序并且没有一个基本索引开始时)

标签: java arrays java-stream


【解决方案1】:

你的最小值是2,所以应该是IntStream.rangeClosed(2, 10)范围的开始

你也可以直接拨打.sum()IntStream

private static int getMissingNumber(int[] a) {
    return IntStream.rangeClosed(2, 10).sum() - Arrays.stream(a).sum();
}

【讨论】:

  • 感谢您的帮助。
【解决方案2】:

从 1 到 10 的数字之和为 10 * (10+1) / 2 = 55。您缺少 1 和 7,因此缺少的数字之和为 8。对我来说是正确的。

【讨论】:

  • 我只想要 2。我也在检查以 20 开头的数组。感谢您的帮助。
  • 如果您使用较大的数组,请考虑使用上述公式计算参考和(如果起始索引可变,则使用两次)。它会更快,消耗更少的内存。如果可以使用简单的公式计算结果,则无需使用流。
  • 如何将上述公式与动态最小值一起使用。 Stream 可以一次性给我最小值、最大值和总和。
  • 设 m 为最小值,n 为最大值。那么 s = (n*(n+1)-m*(m+1))/2。也一口气。
  • 首先我找到了最小值和最大值,然后就可以了。
【解决方案3】:

你需要使用 2 而不是 1 ,

IntStream.rangeClosed(2, 10)

您还可以使用summaryStatistics() 查找数组中的最小和最大元素,

private static int getMissingNumber(int[] a) {
    IntSummaryStatistics summaryStatistics = Arrays.stream(a).summaryStatistics();
    int expectedSum = IntStream.rangeClosed(summaryStatistics.getMin(), summaryStatistics.getMax())
            .sum();
    int actualSum = (int) summaryStatistics.getSum();

    return expectedSum-actualSum;
}

【讨论】:

  • 我想要这样的东西。所以数组可以从任何元素开始,并且可以有 n 个元素。谢谢。
  • .reduce(0, Integer::sum) 替换为.sum()
猜你喜欢
  • 1970-01-01
  • 2020-04-23
  • 2022-12-03
  • 1970-01-01
  • 2012-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多