使用Java streams从int数组中获取缺少的数字
我有以下数组使用Java streams从int数组中获取缺少的数字,java,arrays,java-stream,Java,Arrays,Java Stream,我有以下数组 int [] a = {5,3,10,8,4,2,9,6}; 我正试图从数组中获取丢失的数字 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
int [] a = {5,3,10,8,4,2,9,6};
我正试图从数组中获取丢失的数字
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。我缺少什么?您需要使用2而不是1
IntStream.rangeClosed(2,10)
您还可以使用summaryStatistics()
在数组中查找最小和最大元素
最小值是
2
,因此应该是范围IntStream.rangeClosed(2,10)
您还可以在IntStream
private static int getMissingNumber(int[] a) {
return IntStream.rangeClosed(2, 10).sum() - Arrays.stream(a).sum();
}
从1到10的数字之和为10*(10+1)/2=55。您缺少1和7,因此缺少的数字之和为8。我觉得不错。我想要的正是这样的东西。所以数组可以从任意元素开始,可以有n个元素。谢谢。请将
.reduce(0,Integer::sum)
替换为.sum()
。感谢您的帮助。我只想从2开始。我也在检查从20开始的数组。感谢您的帮助。如果使用较大的数组,请考虑使用上面的公式计算引用和(如果起始索引是可变的,则使用它两次)。它将更快,占用更少的内存。如果可以使用简单的公式计算结果,则无需使用流。如何使用上述公式和动态最小值。流可以一次性给我最小值、最大值和和。让m为最小值,n为最大值。然后s=(n*(n+1)-m*(m+1))/2。首先我已经找到了最小值和最大值,然后这很好。{5,3,10,8,4,2,9,1}的预期输出是什么代码>?我正在检查一个丢失的号码。这里缺少两个数字。是的,但是我们不应该假设输入总是正确的,不是吗?(特别是当它没有排序并且没有一个基本索引开始时)
private static int getMissingNumber(int[] a) {
return IntStream.rangeClosed(2, 10).sum() - Arrays.stream(a).sum();
}