Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

144
Views
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 answers
Answer question

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 Report

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!