【发布时间】:2018-12-19 21:42:33
【问题描述】:
我一直在使用 lambda 学习 Kotlin 和 Java。尽管我不太了解函数式编程,但我正在尝试尽可能多地使用函数式编程。
我正在使用 HackerRank 的问题来研究(以及 Koans 来研究 Kotlin)。我目前正在使用 Kotlin 和 Java 8 解决问题。
我正在尝试解决MiniMax-Sum problem。基本上,描述是这样的:
给定五个正整数,找出可以通过将五个整数中的四个恰好相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为一行,由两个空格分隔的长整数组成。
我正在尝试在 Java 中尽可能多地使用流 API。一个简单的问题是:在排序后,如何将 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();
输入 new long[] {256741038, 623958417, 467905213, 714532089, 938071625} 的结果为 10(最小值)和 15(最大值)
非常感谢所有花时间提供帮助的人!我猜我没有看到 LongStream.of 方法:D 我使用 2 种不同的方法解决了(@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()));
非常感谢大家!
【问题讨论】:
标签: java lambda java-stream