Estoy trabajando en este problema. Las matemáticas no son una de las suites fuertes. Cualquier tip estaría genial. Se supone que devuelve una matriz de índices que son potencias de 2.
function secondPower(arr) { // Return an array containing all indices that are powers of 2 newArray = []; for(let i = 0; i < arr.length; i++){ if(arr[i] % (2 ** i) === 0 && arr[i] != 1){ newArray.push(arr[i]); } } return newArray; }Un ejemplo de la solución es
secondPower([1, 2, 3, 4, 5, 6, 7, 8])devoluciones
[2,3,5]Usando ¿Cuál es la mejor manera de determinar si un número dado es una potencia de dos?
const isPowerOf2 = v => v && !(v & (v - 1)); [1, 2, 3, 4, 5, 6, 7, 8].filter(isPowerOf2);rendimientos
[1, 2, 4, 8]Puede comenzar en el índice 1 y seguir multiplicando por 2 hasta que el valor alcance la longitud de la matriz. Esta solución se ejecuta en tiempo logarítmico y evita un bucle lineal en todos los índices.
function secondPower(arr) { const res = []; for(let i = 1; i < arr.length; i <<= 1) res.push(arr[i]); return res; } console.log(secondPower([1, 2, 3, 4, 5, 6, 7, 8])); // if a number is a power of 2 its base 2 logarithm is an integer const result = [1, 2, 3, 4, 5, 6, 7, 8].reduce((a, v, i) => Number.isInteger(Math.log2(v)) ? a.concat(i) : a, []); console.log(result);