Я изучал Kotlin и Java с лямбдами.Я стараюсь максимально использовать функциональное программирование, которое только могу, хотя я не очень разбираюсь в функциональном программировании.
Я использую проблемы HackerRank для изучения (и Коанов для изучения Kotlin),В настоящее время я решаю проблемы, используя как Kotlin, так и Java 8.
Я пытаюсь решить проблему MiniMax-Sum .По сути, описание выглядит примерно так:
Учитывая пять положительных целых чисел, найдите минимальные и максимальные значения, которые можно вычислить, суммируя ровно четыре из пяти целых чисел.Затем выведите соответствующие минимальное и максимальное значения в виде одной строки из двух разделенных пробелом длинных целых чисел.
Я пытаюсь использовать большинство API потоков, которые я могу использовать в Java.Простой вопрос: как я могу уменьшить, после сортировки, массив int до его четырех первых элементов (и, наконец, в другом сценарии) и суммировать его значения?Я пытался использовать IntStream
, но кажется, что это очень сложно без использования List
.Мне было интересно, можно ли напрямую использовать массив int[]
с IntStream
для сортировки и сокращения элементов и их суммирования.
Используя Kotlin, я решил так:
val minSum: Long = arr.sortedArray().copyOfRange(0, 4).sum().toLong()
val maxSum: Long = arr.sortedArray().copyOfRange(1, 5).sum().toLong()
println("$minSum $maxSum")
Я пытаюсь использовать метод range
вместе с sorted
и sum
.Оно работает.Проблема в том, что сумма всегда возвращает int
, а иногда сумма равна long
.Вот мой код:
long min = IntStream.range(0, arr.length)
.sorted()
.sum();
long max = IntStream.range(1, arr.length + 1)
.sorted()
.sum();
Результат 10 (мин) и 15 (макс) для ввода new long[] {256741038, 623958417, 467905213, 714532089, 938071625}
Большое спасибо всем, кто нашел время, чтобы помочь!Думаю, я не видел метод LongStream.of
: D я решил двумя разными способами (указанными @Aomine, @nullpointer и @Holger):
// using Arrays and Stream
Arrays.sort(arr);
long min = Arrays.stream(arr, 0, 4).sum();
long max = Arrays.stream(arr, 1, 5).sum();
System.out.println(min + " " + max);
// and using LongSummaryStatistics (thanks @Holger)
LongSummaryStatistics ls = LongStream.of(arr).summaryStatistics();
System.out.println((ls.getSum() - ls.getMax()) + " " + (ls.getSum() - ls.getMin()));
Спасибо большое, ребята!