Problema:
Dada una matriz de enteros, devuelva una nueva matriz tal que cada elemento en el índice i de la nueva matriz sea el producto de todos los números en la matriz original excepto el que está en i.
Por ejemplo:
si nuestra entrada fuera [1, 2, 3, 4, 5], la salida esperada sería [120, 60, 40, 30, 24].
Si nuestra entrada fuera [3, 2, 1], la salida esperada sería [2, 3, 6].
Solución 1 (con bucles anidados): puedo resolver esto mediante bucles anidados como se muestra a continuación:
const input = [1, 2, 3, 4, 5]; function output(items) { const finalArray = []; for (let i = 0; i < items.length; i++) { let multipliedNum = 1; items.forEach((item, indx) => { if (i !== indx) { multipliedNum = multipliedNum * item; } }); finalArray.push(multipliedNum) } return finalArray; } console.log(output(input))¿Estoy tratando de encontrar otra solución sin bucles anidados dentro de la función de salida? Cualquier ayuda o sugerencia realmente apreciada.
Si no hay valores cero, puede recorrer todos los valores una vez para obtener el producto. Luego, simplemente devuelva la matriz donde cada producto se divide por cada entrada.
Sin embargo, si hay ceros, hay que hacer un poco más para comprobar cuántos hay. Un cero está bien, pero más de 1 significa que el valor es cero para cada entrada.
const input = [1, 2, 3, 4, 5]; const input2 = [1, 2, 3, 4, 0]; const input3 = [1, 2, 3, 0, 0]; function output(items) { let zeroCount = 0; let totalProduct = 1; for (let i = 0; i < items.length; i++) { if (items[i] === 0) { if (++zeroCount > 1) break; continue; } totalProduct *= items[i]; } if (zeroCount > 1) { // more than 1 zero -> all values are 0 return new Array(items.length).fill(0); } else if (zeroCount === 1) { // only 1 zero -> only the value that is zero will be the totalProduct return items.map(item => item === 0 ? totalProduct : 0); } // no zero in array -> divide the totalProduct by each item return items.map(item => totalProduct / item); } console.log(output(input)) console.log(output(input2)) console.log(output(input3))Según lo que dijo @Mike en el comentario, aquí está la respuesta.
const input = [1, 2, 3, 4, 5]; const mulValues = input.reduce((acc, next) => acc * next); const output = input.map(i => mulValues/i) console.log(output)puedes hacer algo así (suponiendo que la matriz no contenga cero):
const input = [1, 2, 3, 4, 5]; function output(items) { const finalArray = []; const multipliedNum=1; for (let i = 0; i < items.length; i++) { multipliedNum *= item[i]; } for (let i = 0; i < items.length; i++) { finalArray.push(multipliedNum/item[i]); } return finalArray; } console.log(output(input))