首页 > 解决方案 > 如何使用 IntStream 对 int 数组的特定索引数求和?

问题描述

我一直在用 lambda 学习 Kotlin 和 Java。我正在尝试尽可能多地使用函数式编程,即使我不太了解函数式编程。

我正在使用 HackerRank 的问题来研究(以及 Koans 来研究 Kotlin)。我目前正在使用 Kotlin 和 Java 8 解决问题。

我正在尝试解决MiniMax-Sum 问题。基本上,描述是这样的:

给定五个正整数,找出可以通过将五个整数中的四个恰好相加来计算的最小值和最大值。然后将各自的最小值和最大值打印为单行的两个空格分隔的长整数。

我正在尝试使用 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")

我正在尝试将该方法与andrange一起使用。有用。问题是总和总是返回一个,有时总和是一个值。这是我的代码:sortedsumintlong

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方法:DI 使用 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()));

非常感谢你们!

标签: javalambdajava-stream

解决方案


虽然您可以通过排序来解决此任务,但如其他答案所示,这是不必要的工作。“五分之四相加”的意思是“除了一个之外的所有值相加”,所以你所要做的就是从所有元素的总和中减去一个元素。减去最大元素得到四的最小和,减去最小元素得到四的最大和:

IntSummaryStatistics s = IntStream.of(1, 3, 5, 7, 9).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());
16 24

或者,如果源是一个数组:

IntSummaryStatistics s = Arrays.stream(array).summaryStatistics();
System.out.printf("%d %d%n", s.getSum()-s.getMax(), s.getSum()-s.getMin());

推荐阅读