我正在对 hackerrank 进行挑战,寻找 5 个值数组的最大和最小子和。我让它通过了第一个测试用例(见下文),但它似乎在较大的值上遇到了 ArrayIndexOutOfBounds 异常。
import java.io.*;
import java.math.*;
import java.security.*;
import java.text.*;
import java.util.*;
import java.util.concurrent.*;
import java.util.regex.*;
public class Solution {
// Complete the miniMaxSum function below.
static void miniMaxSum(int[] arr, int n) {
int max=-10000;
int min=10000;
int indexMax=-10000;
int indexMin=10000;
int sum=0;
//Find sum of all values in array
for (int i : arr)
{
sum += i;
}
//Find value of Max and index of Max
for (int i : arr)
{
if (i >= max)
{
max=arr[i-1];
indexMax=i-1;
}
}
//Find value of Min and index of Min
for (int i : arr)
{
if (i <= min)
{
min=arr[i-1];
indexMin=i-1;
}
}
//Remove max value from minimum sub sum value
int minSubSum=sum-max;
//Remove min value from maximum sub sum value
int maxSubSum=sum-min;
System.out.println(minSubSum + " " + maxSubSum);
}
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) {
int[] arr = new int[5];
String[] arrItems = scanner.nextLine().split(" ");
scanner.skip("(\r\n|[\n\r\u2028\u2029\u0085])?");
for (int i = 0; i < 5; i++) {
int arrItem = Integer.parseInt(arrItems[i]);
arr[i] = arrItem;
}
int n = arr.length;
miniMaxSum(arr,n);
scanner.close();
}
}
失败的测试用例
输入(标准输入):7 69 2 221 8974
预期输出:299 9271
编译器消息
运行时错误
错误(标准错误)
线程“main”中的异常 java.lang.ArrayIndexOutOfBoundsException: 6
在 Solution.miniMaxSum(Solution.java:28)
在Solution.main(Solution.java:72)
通过测试用例
输入(标准输入):1 2 3 4 5
您的输出(标准输出):10 14
预期输出:10 14
对这个错误有什么想法吗?有适合我的方法的解决方案吗?
谢谢!
最佳答案
问题出在这一段代码
//Find value of Max and index of Max
for (int i : arr)
{
if (i >= max)
{
max=arr[i-1];
indexMax=i-1;
}
}
具体来说,max=arr[i-1]
是罪魁祸首。您已经使用 for 循环遍历了数组中的整数。
在第二个示例中,第一个数字是 7
。 7 比当前最大值大,但数组只有 5 长。 arr[i-1]
将转换为 arr[7-1]
= arr[6]
,这超出了数组的范围。
最大值必须存储为
max = i
而不是 max=arr[i-1]
as i
已经保存了整数的值,而不是索引。
相同的编辑必须应用于 min
函数。
关于java - MiniMaxSum 通过了第一个测试用例,但因值较大而失败 (hackerrank),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52723346/