¿Cómo puedo utilizar un IntStream de suma específicas números indexados de una matriz int?

otros:

He estado estudiando Kotlin y Java con lambdas. Estoy intentando el uso de la mayor parte de la programación funcional que puedo, a pesar de que no sé mucho de la programación funcional.

Estoy usando problemas de HackerRank a estudiar (y Koanes para estudiar Kotlin también). Actualmente estoy utilizando la solución de los problemas tanto Kotlin y Java 8.

Estoy tratando de resolver el problema MiniMax-Sum . Básicamente, la descripción es algo como esto:

Dadas cinco números enteros positivos, encontrar los valores mínimos y máximos que se pueden calcular sumando exactamente cuatro de los cinco enteros. A continuación, imprima los respectivos valores mínimo y máximo como una sola línea de dos enteros largos separados por espacios.

Estoy tratando de utilizar la mayor parte de la API de secuencias que puedo cuando en Java. La pregunta es sencilla: ¿Cómo puedo reducir, después de la clasificación, la matriz int a sus cuatro primeros elementos (y última, en un escenario diferente) y sumar sus valores? Yo estaba tratando de usar IntStream, pero parece que es muy difícil sin usar List. Me preguntaba si es posible utilizar directamente la int[]matriz conIntStream para ordenar y reducir los elementos y los resumir.

Usando Kotlin He resuelto de esta manera:

val minSum: Long = arr.sortedArray().copyOfRange(0, 4).sum().toLong()
val maxSum: Long = arr.sortedArray().copyOfRange(1, 5).sum().toLong()
println("$minSum $maxSum")

Estoy tratando de utilizar el rangemétodo, junto con sortedy sum. Funciona. El problema es que la suma siempre devuelve una int, ya veces la suma es un longvalor. Aquí está mi código:

long min = IntStream.range(0, arr.length)
        .sorted()
        .sum();

long max = IntStream.range(1, arr.length + 1)
        .sorted()
        .sum();

Resultado es 10 (min) y 15 (max) para la entrada new long[] {256741038, 623958417, 467905213, 714532089, 938071625}


Mucho a todos los que se tomaron el tiempo para ayuda Gracias! Supongo que no vi el LongStream.ofmétodo: DI resuelto por medio de 2 maneras diferentes (apuntado por @Aomine, @nullpointer y @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()));

¡Muchas gracias chicos!

Holger:

Si bien se puede resolver esta tarea de clasificación, como se muestra en otras respuestas, esto es un trabajo innecesario. “sumando cuatro de cada cinco” valores medios sumadores “todos menos uno”, por lo que todo lo que tiene que hacer, es restar un elemento de la suma de todos los elementos. Restar el máximo elemento para obtener la suma mínima de cuatro, restar el elemento mínimo para obtener la suma máxima de cuatro:

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

O bien, si la fuente es una matriz:

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

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=177281&siteId=1
Recomendado
Clasificación