Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

145
Vistas
Dividir matriz en mitades iguales

Problema: encuentre un índice N donde la suma de los enteros a la izquierda de N sea igual a la suma de los enteros a la derecha de N. Si no hay un índice que haga que esto suceda, devuelva -1.

Mi solución

 function findEvenIndex(arr) { var sum = i => i.reduce((a, b) => a + b), l = arr.length; for (let j = 0; j <= l; j++) { if (sum(arr.slice(0, j - 1)) === sum(arr.slice(j, l))) { return j } else { continue; } } return -1 } console.log( findEvenIndex([1, 2, 3, 4, 3, 2, 1]) )

Cuando ejecuto esto, digamos findEvenIndex ([1,2,3,4,3,2,1]), ¿no devuelve nada? ¿Dónde está el error que impide que se devuelva 3 en el caso de este ejemplo?

He configurado el procedimiento de bucle for de la siguiente manera para ver qué está pasando

 for(let j = 0; j <= arr.length; j++){ var left = arr.slice(0, j-1), right = arr.slice(j) console.log(left, right) } /* returns [1] [3,4,3,2,1] [1,2] [4,3,2,1] [1,2,3] [3,2,1] as expected */

Sin embargo, cuando intente consola. registrar la suma de estas matrices:

 function sum(i){ return i.reduce((a, b) => a+b)} var l = arr.length; for(let j = 0; j <= l; j++){ var left = arr.slice(0, j-1), right = arr.slice(j) console.log(sum(left), sum(right)) }

Usando el fragmento anterior, findEvenIndex([1,2,3,4,3,2,1]) devuelve "15 16"?

about 4 years ago · Juan Pablo Isaza
3 Respuestas
Responde la pregunta

0

El problema principal con su código es que llamar a sum([]) arroja un error (que encontrará en la consola durante la depuración):

Reducción de matriz vacía sin valor inicial

El método de reduce no sabe qué devolver si su matriz no tiene ningún valor. Lo resuelves pasando el valor inicial como segundo argumento a .reduce :

 const add = (a, b) => a + b; [1, 2, 3].reduce(add); // add(add(1, 2), 3) [1, 2].reduce(add); // add(1, 2) [1].reduce(add); // 1 [].reduce(add); // ERROR: Reduce of empty array // with no initial value [1, 2].reduce(add, 0); // add(add(0, 1), 2) [1].reduce(add, 0); // add(0, 1) [].reduce(add, 0); // 0

Una vez que solucione eso, es más fácil depurar el resto del código.

Arreglando lo

Aquí hay un ejemplo que creo que hace lo que debería hacer:

 function findEvenIndex(arr) { // Add a seed value --v var sum = i => i.reduce((a, b) => a + b, 0), l = arr.length; for (let j = 0; j <= l; j++) { const left = arr.slice(0, j); const right = arr.slice(j + 1); const leftSum = sum(left); const rightSum = sum(right); console.log( { left, right, leftSum, rightSum } ); if (leftSum === rightSum) { return j } } return -1 } console.log( findEvenIndex([1]), // 0 findEvenIndex([1, 2, 3, 4, 3, 2, 1]), // 3 findEvenIndex([10, 0, 5, 5]), // 1 findEvenIndex([3, 2, 1]) // -1 )

Otro enfoque

¡Tenga en cuenta que recorrer todos los elementos de la matriz para cada índice es bastante costoso! Un enfoque más eficiente sería:

  • Tome la suma de la matriz de origen, guárdela como rightSum
  • Definir leftSum como 0
  • Mire el valor entero en el índice 0 y réstelo de rightSum
  • Si leftSum === rightSum , devuelve 0
  • De lo contrario, agregue valor a leftSum e incremente el índice
  • Una vez que haya alcanzado el índice final, devuelva -1

 const findEvenIndex = (arr) => { let leftSum = 0; let rightSum = arr .reduce((a, b) => a + b, 0); for (let i = 0; i < arr.length; i += 1) { const n = arr[i]; rightSum -= n; if (leftSum === rightSum) return i; leftSum += n; } return -1; } console.log( findEvenIndex([1]), // 0 findEvenIndex([1, 2, 3, 4, 3, 2, 1]), // 3 findEvenIndex([10, 0, 5, 5]), // 1 findEvenIndex([3, 2, 1]) // -1 )

about 4 years ago · Juan Pablo Isaza Denunciar

0

Puede obtener el índice como el siguiente usando reduce(). Su implementación con respecto a reduce() no es correcta.

 function findEvenIndex(arr) { for(let i = 0; i < arr.length; i++) { let leftSum = arr.slice(0, i).reduce((accumulator, current) => accumulator + current, 0); let rightSum = arr.slice(i + 1).reduce((accumulator, current) => accumulator + current, 0); if (leftSum === rightSum) { return i; } } return -1; } console.log( findEvenIndex([1, 2, 3, 4, 3, 2, 1]) )

Consulte el siguiente blog para averiguar cómo funciona Array reduce ()

 https://www.javascripttutorial.net/javascript-array-reduce/
about 4 years ago · Juan Pablo Isaza Denunciar

0

Al terminar mi solución, noté que es efectivamente lo mismo que la respuesta anterior de @Abu. La idea es utilizar la fuerza bruta en el camino a través de la matriz, comparando las dos mitades a medida que avanza.

 /* Find an index N where the sum of the integers to the left of N is equal to the sum of the integers to the right of N. If there is no index that would make this happen, return -1 */ const array = [10, 90, 10, 1, 10, 90, 10]; // incrementTotal :: (Number t, Number n) -> t incrementTotal = (total, number) => total + number; // indexIsEqual :: (Array a, Number c) -> Boolean function indexIsEqual(array, count) { let chunkL = array.slice(0, count-1); let chunkR = array.slice(count , ); return chunkL.reduce(incrementTotal) === chunkR.reduce(incrementTotal); } // findEvenIndex :: (Array a) -> (a[x] || -1) function findEvenIndex(array) { for (let count = 2; count < array.length; count++) { if (indexIsEqual(array, count)) { return array[count-1]; } } return -1; } console.log(findEvenIndex(array));
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda