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"?
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); // 0Una vez que solucione eso, es más fácil depurar el resto del código.
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 )¡Tenga en cuenta que recorrer todos los elementos de la matriz para cada índice es bastante costoso! Un enfoque más eficiente sería:
rightSumleftSum como 0rightSumleftSum === rightSum , devuelve 0leftSum e incremente el índice-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 )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/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));