MiniMaxSum通过第一个测试用例,失败并返回较大值(hackerrank)

时间:2018-10-09 14:23:12

标签: java arrays indexing stdin indexoutofboundsexception

我正在对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();
}
}

测试用例失败

Input (stdin): 7 69 2 221 8974 Expected Output: 299 9271

Compiler Message Runtime Error Error (stderr) Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 6 at Solution.miniMaxSum(Solution.java:28) at Solution.main(Solution.java:72)

通过测试用例

Input (stdin): 1 2 3 4 5 Your Output (stdout): 10 14 Expected Output: 10 14

对这个错误有任何想法吗?有什么适合我方法的解决方案吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

问题出在这段代码中

//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]

因为i已保存整数值,而不是索引值。

必须对min函数应用相同的编辑。