java - MiniMaxSum 通过了第一个测试用例,但因值较大而失败 (hackerrank)

标签 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();
}
}

失败的测试用例

输入(标准输入):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/

相关文章:

java - 在java中绘制多个椭圆

arrays - <select> 可以通过 Angular.js 中的索引绑定(bind)到数组吗?

c - 赋值 c 中的不兼容类型

jQuery 将升序数字添加到 ID

indexing - 如何查询和列出 elasticsearch 索引中的所有类型?

mongodb - 防止带有索引的多个字段重复

Java:getter 方法与公共(public)实例变量:性能和内存

java - MapView 上的空指针异常

java - 从文件列表中删除文件

mysql - $sql = mysql_query ("SELECT * FROM books WHERE tags LIKE ' %$_GET[term] %' LIMIT 0,$_GET[results]");