Суммирование значений со знаками в Java с IntStream
Если абсолютные значения и знаки поступают отдельно, перед суммированием примените знак по каждому соответствующему индексу. signs[i] означает положительный знак при true и отрицательный при false, поэтому каждое значение можно восстановить одним условным выражением.
Задача гарантирует одинаковую длину массивов от 1 до 1 000 и абсолютные значения от 1 до 1 000. Отдельная сортировка знаков нарушит их соответствие исходным значениям; обрабатывайте массивы в заданном порядке.
Порядок обработки
Прочитайте элементы обоих массивов с одним индексом, примените знак, затем сложите полученные значения со знаками.
Читаем соответствующие индексы вместе
Сохраните этот полный класс в Solution.java. Он был скомпилирован для Java 11 и выполнен на JDK 17.
import java.util.stream.IntStream;
public class Solution {
public int solution(int[] absolutes, boolean[] signs) {
return IntStream.range(0, absolutes.length)
.map(i -> signs[i] ? absolutes[i] : -absolutes[i])
.sum();
}
}
IntStream.range включает индекс 0 и исключает absolutes.length. map применяет знак к каждому абсолютному значению, а sum складывает результаты. Метод не меняет входные данные и не создаёт отдельный массив значений со знаками.
| Абсолютное значение | Знак | Фактическое значение |
|---|---|---|
| 4 | true | 4 |
| 7 | false | -7 |
| 12 | true | 12 |
Сумма этих значений равна 9. Для входных данных [1,2,3] и [false,false,true] слагаемые взаимно сокращаются до 0. Недостаточно подсчитать только положительные и отрицательные флаги: важна и абсолютная величина каждого слагаемого.
Границы целых чисел и контракт
Всего не более 1 000 слагаемых с абсолютным значением не более 1 000, поэтому абсолютное значение суммы ограничено 1 000 000. Даже граничные случаи со всеми положительными или всеми отрицательными значениями укладываются в int. Время работы — O(n), дополнительная память — O(1).
Метод предполагает допустимые абсолютные значения и одинаковую длину массивов по условиям задачи. Он не заменяет проверку null, длины и значений для произвольных входных данных приложения. При расширении границ нужно пересмотреть типы и слагаемых, и накопителя.
Для другого вычисления с двумя массивами см. скалярное произведение массивов, а для результатов за пределами int — последовательность с шагом x и типом long. Порядок изучения представлен в руководстве по задачам на Java.
Обсуждение