Я делаю задание на хакерранке, которое находит максимальную и минимальную подсумму массива из 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 после заданий max и min.




Проблема заключается в этом фрагменте кода
//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 везде, когда увидел, что это вне поля зрения, похоже, я немного увлекся ...
Если в коде используется цикл for-each,
iне является индексом в массиве,i- это значение массива для этой итерации.