Estoy trabajando en el desafío Hackerrank Mini-Max Sum :
Dados cinco enteros positivos, encuentre los valores mínimo y máximo que se pueden calcular sumando exactamente cuatro de los cinco enteros. Luego imprima los respectivos valores mínimo y máximo como una sola línea de dos enteros largos separados por espacios.
Ejemplo
arr = [1, 3, 5, 7, 9]
La suma mínima es
1 + 3 + 5 + 7 = 16
y la suma máxima es3 + 5 + 7 + 9 = 24
.La función imprime
16 24
Envié el siguiente código, pero no pasa un caso de prueba de muestra. ¿Hay algo mal en mi código?
function miniMaxSum(arr) { let set = [...new Set(arr)]; const MIN = set.filter((num) => num !== Math.max(...set)).reduce((sum, num) => sum + num); const MAX = set.filter((num) => num !== Math.min(...set)).reduce((sum, num) => sum + num); console.log(MIN + ' ' + MAX); }
El error es un "Error de tiempo de ejecución"
Algunos asuntos:
filter
devolverá una matriz vacía, en la que se llama a reduce
. Como reduce
se llama sin el argumento "valor inicial", se producirá un error en tiempo de ejecución.No hay problema, pero:
filter
no es eficiente: será el mismo resultado cada vez, por lo que es mejor calcularlo solo una vez.Aquí hay una solución de trabajo que tiene en cuenta los puntos anteriores:
function miniMaxSum(arr) { const sum = arr.reduce((a, b) => a + b); const min = sum - Math.max(...arr); const max = sum - Math.min(...arr); console.log(`${min} ${max}`); }
@Trincot ya explicó el error en todos los detalles. Nada que añadir allí.
Aquí hay otra forma de hacerlo evitando cálculos redundantes:
function mms(arr) { const [a,...ar]=arr; let [min,max,sum]=[a,a,a]; ar.forEach(c=>{ if(c<min) min=c else if (c>max) max=c sum+=c }); return `${sum-max} ${sum-min}` }