La tarea Dada una serie de números enteros, encuentra el que aparece un número impar de veces.
Siempre habrá un solo número entero que aparecerá un número impar de veces.
Los ejemplos [0,1,0,1,0] deberían devolver 0, porque ocurre 3 veces (lo cual es impar). [1,2,2,3,3,3,4,3,3,3,2,2,1] debería devolver 4, porque aparece 1 vez (lo cual es impar).
Vi esta solución, pero me cuesta entender la lógica de por qué funciona:
p.ej
function findOdd(arr) { return arr.find((item) => arr.filter(el => el == item).length % 2) } console.log(findOdd([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5])) // returns 5 Si el número debe ser impar, ¿por qué no lo es? ... .length % 2 !== 0 ; ¡Realmente agradecería cualquier ayuda! Gracias :)
arr.filter(el => el == item).length % 2 devuelve 0 o 1. Esto es lo suficientemente bueno, ya que ese valor será forzado a booleano, y dado que 0 es falso y 1 verdadero, tiene el efecto deseado.
Tenga en cuenta que este algoritmo tiene una complejidad O(n²). Es posible hacer esto de manera más eficiente.
function findOdd(arr) { return arr.reduce((a, b) => a ^ b); } console.log(findOdd([20,1,-1,2,-2,3,3,5,5,1,2,4,20,4,-1,-2,5])) // returns 5 Esto usa XOR. Todos los valores en la matriz son XOR juntos. Se basa en la consideración de que a ^ a == 0 para cualquier valor de a . Y a ^ 0 == a . Entonces, si tenemos un número impar de a , obtendremos a , de lo contrario 0. Como solo hay un número cuya ocurrencia es impar, lo encontraremos de esta manera. El caso especial de 0 también funcionará.
Esta es una solución rápida y eficiente.
arr.find((item)=>{} esto recorrerá cada elemento de la matriz y devolverá el primer valor satisfecho donde devolvemos verdadero;
arr.filter(el => el == item) esto volverá a recorrer la misma matriz y devolverá una matriz de elementos duplicados ejemplo if arr = [1,1,2,1,3] luego arr.filter(el => el == 1) devolverá [1,1,1] ;
arr.filter(el => el == item).length % 2 esto devolverá el recordatorio de la matriz de resultados de elementos duplicados divididos por 2, que debería ser 0 o 1
Para javascript 0 == false y 1 == true ; entonces, cuando el bucle de búsqueda encuentre un 1 del filtro, devolverá el valor;