Java 数组中最大数之和
Java 数组中最大数之和,java,arrays,sorting,Java,Arrays,Sorting,arr是一个仅包含5个元素的整数数组。 我们只需要计算这5个元素中4个最小数和4个最大数的和 示例:int[]arr={5,2,3,4,1} 在这个数组中, 4最小值为:1,2,3,4sototalMin=1+2+3+4=10 最大的4个最大数字是:5,4,3,2sototalMax=14 因此,输出将是:10、14 我下面的代码适用于40%案例,但不适用于60%案例 我先对数组排序。。因此,始终最小的数字将是:arr[0]、arr[1]、arr[2]、arr[3]和MAX将是arr[4]、ar
arr
是一个仅包含5个元素的整数数组。
我们只需要计算这5个元素中4个最小数和4个最大数的和
示例:int[]arr={5,2,3,4,1}
在这个数组中,
4最小值为:1,2,3,4
sototalMin=1+2+3+4=10
最大的4个最大数字是:5,4,3,2
sototalMax=14
因此,输出将是:10、14
我下面的代码适用于40%案例,但不适用于60%案例
我先对数组排序。。因此,始终最小的数字将是:arr[0]、arr[1]、arr[2]、arr[3]
和MAX将是arr[4]、arr[3]、arr[2]、arr[1]
HackerRank显示我的回答在某些情况下是错误的,但这些都是锁定的。我不知道那些案子。。。我还想知道这些案例会是什么
谁能给我解释一下吗?我在这里做错了什么
您可以在此处查看问题的更多详细信息:
在给定的约束条件下,可以生成的最大和是4*109,它溢出了一个整数。但是,它非常适合于
long
,因此将值求和为long
s应该可以:
long min = (long)arr[0] + (long)arr[1] + (long)arr[2] + (long)arr[3];
long max = (long)arr[4] + (long)arr[3] + (long)arr[2] + (long)arr[1];
但是,请注意,由于排序的原因,此解决方案仍然具有O(nlog(n))时间复杂度。这可以改进为O(n)-在数组的一次遍历中,可以得到它的和,最小值和最大值,然后从和中减去最大值,得到“最小”值,从和中减去最小值,得到“最大”值 使用
IntStream
将为您完成大部分繁重的工作:
IntSummaryStatistics stat = Arrays.stream(arr).summaryStatistics();
long min = stat.getSum() - stat.getMax();
long max = stat.getSum() - stat.getMin();
上面的操作将起作用,原因是输入,结果可能超过32位,因此我们必须使用long,并且在执行求和操作之前,我们已对long的每个值进行了强制转换,因为它也可能超过32位。我的错误是没有将int转换为long(64位整数)。错误是因为整数溢出
static void miniMaxSum(int[] arr)
{
Arrays.sort(arr);
long min= (long)arr[0]+(long)arr[1]+(long)arr[2]+(long)arr[3];
long max= (long)arr[4]+(long)arr[3]+(long)arr[2]+(long)arr[1];
System.out .println(min+" "+max);
}
如果你能提供一个你的程序无法运行的“60%”案例,那将是非常有帮助的。hackerRank显示那些案例被锁定..我也不知道那些案例,这就是为什么我在这里询问。。。其他情况可能是什么?可能您没有听到提示:“小心整数溢出!使用64位整数。”此外,尽管与您的问题无关,但也不要给变量命名以大写字母开头(
Max
-使用Max
)。另外,如果可以使用int
(或者可以使用Long
的Long
),则不要使用Integer
。创建对象是没有意义的,不过对于这样一个小程序来说,这并不重要。除了Eran报告的问题之外,可能会导致您决定对数组进行排序,您超出了问题的超时限制。您不需要使用Long
。最好使用long
,而且可读性更好long min=(long)arr[0]+arr[1]+arr[2]+arr[3]
-更短,更容易理解。IntStream
类似乎非常适合这类问题。谢谢
long first = arr[0];
long second = arr[1];
long third = arr[2];
long fourth = arr[3];
long fifth = arr[4];
long min = first + second + third + fourth;
long Max = second + third + fourth + fifth;
static void miniMaxSum(int[] arr)
{
Arrays.sort(arr);
long min= (long)arr[0]+(long)arr[1]+(long)arr[2]+(long)arr[3];
long max= (long)arr[4]+(long)arr[3]+(long)arr[2]+(long)arr[1];
System.out .println(min+" "+max);
}