Estoy viendo el problema de las Sumas de Partes en CodeWars:
Consideremos este ejemplo (matriz escrita en formato general):
ls = [0, 1, 3, 6, 10]Sus siguientes partes:
ls = [0, 1, 3, 6, 10] ls = [1, 3, 6, 10] ls = [3, 6, 10] ls = [6, 10] ls = [10] ls = []Las sumas correspondientes son (juntas en una lista):
[20, 20, 19, 16, 10, 0]La función
parts_sums(o sus variantes en otros lenguajes) tomará como parámetro una lista ls y devolverá una lista de las sumas de sus partes como se definió anteriormente.
El objetivo de la función es sumar los elementos de la matriz y luego cambiar el primer elemento de la matriz cada vez hasta que la longitud de la matriz sea 0.
Tengo esta solución para ello:
function partsSums(ls) { let len = ls.length; let arr = []; for (let i = 0; i < len +1; i++) { arr.push(summation(ls)); ls.shift(); } function summation(a) { let sum = 0; for (let i = 0; i < a.length; i++) { sum += a[i]; } return sum; } return arr; }Funciona cuando lo ejecuto en mi editor: todos los casos de prueba en CodeWars que se completan con éxito pasan, pero cuando intento enviar, aparece este error:
El proceso fue terminado. Se tardó más de 12000ms en completarse
Soy nuevo en algoritmos y no puedo entender dónde está el error. Cualquier sugerencia es bienvenida.
El objetivo de la función es sumar los elementos de la matriz y luego cambiar el primer elemento de la matriz cada vez hasta que la longitud de la matriz sea 0
El desafío del código en realidad no habla de cambios . Puede hacer esto sin cambiar, almacenando los valores inmediatamente en el índice derecho en la matriz de resultados. Además, la summation de su función está sumando algunos de los mismos valores repetidamente. Esto se puede evitar.
Toma este ejemplo:
ls = [0, 1, 3, 6, 10]La salida se puede construir de la siguiente manera:
Cree una matriz que sea un elemento más larga y tenga el valor 0 al final:
ls: 0 1 3 6 10 result: . . . . . 0(Los valores en los puntos no son relevantes en este punto)
Luego comience desde el lado derecho y cree una suma acumulada (hacia atrás):
ls: 0 1 3 6 10 result: ↓ ↓ ↓ ↓ ↓← 0 ↓ ↓ ↓ ↓←10 ↓ ↓ ↓←16 ↓ ↓←19 ↓←20 20Entonces, el resultado anterior en el índice i+1 se agrega a la entrada en el índice i, y funciona hacia atrás hasta el comienzo de la matriz.
Aquí hay una implementación:
function partsSums(ls) { let result = Array(ls.length + 1).fill(0); for (let i = ls.length - 1; i >= 0; i--) { result[i] = ls[i] + result[i + 1]; } return result; }