MiniMaxSum проходит первый тестовый пример, не работает с большими значениями (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

Есть идеи по поводу этой ошибки? Любое решение, которое впишется в мой подход?

Спасибо!

Если в коде используется цикл for-each, i не является индексом в массиве, i - это значение массива для этой итерации.

Andrew S 09.10.2018 16:37

Вы правы, похоже, у меня не должно было быть -1 после заданий max и min.

DavidKenyon96 09.10.2018 17:28
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
377
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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.

Это исправило, большое спасибо! Я начал добавлять -1 везде, когда увидел, что это вне поля зрения, похоже, я немного увлекся ...

DavidKenyon96 09.10.2018 16:41

Другие вопросы по теме