Найти сумму последующих 3 элементов массива

Мне нужно суммировать три последовательных элемента массива при динамическом добавлении чисел к одному и тому же массиву и возвращать true, если сумма равна значению аргумента. Я уже написал приведенный ниже код, и все он возвращает требуемый результат, но он не работает для некоторых тестовых случаев (у меня нет точных тестовых случаев). Может ли кто-нибудь сказать мне, какой именно сценарий может привести к сбою моей программы?

import java.util.LinkedList;
import java.util.List;

public class Test {
    List<Integer> mergeList = new LinkedList<Integer>();
    List<List<Integer>> allList = new LinkedList<List<Integer>>();
    List<Integer> tail;
    int from = 0;
    int to = 0;

    public void addLast(int[] list) {
        allList.removeAll(allList);

        for(int i : list) {
            mergeList.add(i);
        }

        if (mergeList.size() > 0) {
            int j = 0;

            while(to < mergeList.size()){
                from = j;
                to = j + 3;
                tail = mergeList.subList(from, to);
                j++;
                allList.add(tail);
            }
        }
    }

    public boolean containsSum3(int sum) {
        boolean retVal = false;
        
        for (List<Integer> sum3List : allList) {
            if (sum3List.stream().mapToInt(Integer::intValue).sum() == sum) {
                retVal = true;
            }
        }

        return retVal;
    }

    public static void main(String[] args) {
        Test s = new Test();

        s.addLast(new int[] { 1, 2, 3 });
        System.out.println(s.containsSum3(6));
        System.out.println(s.containsSum3(9));

        s.addLast(new int[] { 4 });
        System.out.println(s.containsSum3(9));

        s.addLast(new int[] { 5, 2});
        System.out.println(s.containsSum3(11));
        
        s.addLast(new int[] { 0, -1 });
        System.out.println(s.containsSum3(7));
        System.out.println(s.containsSum3(2));
    }
}

Выход:

true
false
true
true
true
false

Вот очевидный для вас: если в первый раз вы вызываете addLast массив с менее чем 3 элементами, вы получите исключение IndexOutOfBounds.

sprinter 10.02.2023 04:12

Да, я тоже это заметил. Но он обеспечивает более 3 элементов.

chk.buddi 10.02.2023 04:19

Откуда вы знаете, что тестовые примеры содержат более 3 элементов? В вопросе говорится, что у вас нет тестовых сценариев.

sprinter 10.02.2023 04:28

" (У меня нет точных тестовых случаев) " Не помешает добавить те крайние случаи, о которых упоминал @sprinter... возвращение false, когда присутствует недостаточно элементов, - это хорошее начало, чтобы увидеть, проходите ли вы тестовые случаи.

Dennis LLopis 10.02.2023 04:46

Привет @DennisLLopis, да, я разберусь с его точкой зрения и посмотрю. Спасибо

chk.buddi 10.02.2023 05:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
5
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я сгенерировал большие случайные наборы целых чисел и не смог найти очевидных случаев, когда ваш код дает сбой, кроме недостаточного количества элементов. Между прочим, функция, которую я написал для проверки наличия в списке последовательных n элементов, суммирующих заданное значение, была следующей:

public static boolean containsSum(List<Integer> list, int sum, int n) {
    return IntStream.range(0, list.size() - n + 1)
            .anyMatch(i -> list.subList(i, i + n).stream()
                    .reduce(0, Integer::sum) == sum);
}

Я не вижу причин для вашего кода, который хранит весь список списков: компромисс между пространством и временем не имеет большого смысла. Я предлагаю вам упростить addLast, чтобы просто добавить элементы в mergeList. В вашем коде есть куча стилистических проблем, но я уверен, что вы решите их в свое время.

Код OP и ваш, очевидно, не распространяется на целочисленные переполнения.

Andrey B. Panfilov 10.02.2023 06:34

Отличный момент. Я был бы удивлен, если бы это были неудачные тесты, но, тем не менее, хороший пикап.

sprinter 10.02.2023 12:27

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

Java Spring загружает несколько баз данных, репозиторий использует неправильную базу данных
Java 17 «выражение 'switch' не охватывает все возможные входные значения» не отображается, если нет возврата
Как кодировать и отправлять сообщение ISO 8583 с помощью ASCII и Hexa?
Измените текстовое представление во фрагменте на основе положительных/отрицательных кнопок DialogAlert в Android Java
Лучший способ проверить, является ли новое значение логическим предшественником текущего значения
Не удается найти задачи, соответствующие «spring-boot: run», поскольку проект «spring-boot» не найден в корневом проекте «demo»
Плюсы и минусы определения графа как вложенных узловых объектов по сравнению со словарем?
Изменить список объекта одного из свойств, если найдено более 1 записи в группе в списке с использованием java 8
Потоки Java: рассчитать длину пути, используя список координат, используя функции потока
Не удается открыть swagger 2 в приложении Spring Boot 3