Los elfos están trabajando en un sistema para verificar las listas de regalos de los niños 👧👦. Sin embargo, ¡algunas listas están incompletas y faltan números!
Tu tarea es escribir una función que, dado un array de números, encuentre todos los números que faltan entre 1 y n (donde n es el tamaño del array o el número más alto del array).
Eso sí, ten en cuenta que:
- Los números pueden aparecer más de una vez y otros pueden faltar
- El array siempre contiene números enteros positivos
- Siempre se empieza a contar desde el 1
findMissingNumbers([1, 2, 4, 6])
// [3, 5]
findMissingNumbers([4, 8, 7, 2])
// [1, 3, 5, 6]
findMissingNumbers([3, 2, 1, 1])
// []
findDisappearedNumbers([5, 5, 5, 3, 3, 2, 1])
// [4]NOTA Para correr este código necesitas la versión 22 o superior de Node.js. En caso contrario, puedes crear una función difference que haga lo mismo que Set.prototype.difference.
Set.prototype.difference = function (set) {
return new Set([...this].filter((x) => !set.has(x)));
};function findMissingNumbers(nums) {
const maxNumber = Math.max(...nums);
const fullSetOfNumbers = new Set(
Array.from({ length: maxNumber }, (_, index) => index + 1),
);
const uniqueNumbers = new Set(nums);
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
return [...missingNumbers];
}Para resolver este reto, utilice diferencia de conjuntos. Esto consiste en crear un conjunto con todos los números del 1 al número más alto del array, luego crear un conjunto con los números únicos del array y finalmente obtener la diferencia entre ambos conjuntos.
Para esto utilice el método Math.max para obtener el número más alto del array, luego cree un conjunto con todos los números del 1 al número más alto del array utilizando Array.from y Set. Después cree un conjunto con los números únicos del array utilizando Set. Finalmente obtuve la diferencia entre ambos conjuntos y devolví un array con los números faltantes.
Veamos un ejemplo:
Supongamos que tenemos el siguiente array:
const nums = [1, 2, 4, 6];Primero obtenemos el número más alto del array, en este caso es el número 6:
const maxNumber = Math.max(...nums);
// const maxNumber = Math.max(...[1, 2, 4, 6]);
// const maxNumber = Math.max(1, 2, 4, 6);
const maxNumber = 6;Luego creamos un conjunto con todos los números del 1 al número más alto del array, para este caso utilizamos Array.from y Set, donde Array.from crea un array con los números del 1 al 6 y Set convierte ese array en un conjunto:
const fullSetOfNumbers = new Set(
Array.from({ length: maxNumber }, (_, index) => index + 1),
);
// Array.from({ length: 6 }, (_, index) => index + 1);
// Array.from([undefined, undefined, undefined, undefined, undefined, undefined], (_, index) => index + 1);
// [1, 2, 3, 4, 5, 6]
// new Set([1, 2, 3, 4, 5, 6]);
const fullSetOfNumbers = new Set([1, 2, 3, 4, 5, 6]);Después creamos un conjunto con los números únicos del array, para este caso utilizamos Set:
const uniqueNumbers = new Set(nums);
// const uniqueNumbers = new Set([1, 2, 4, 6]);
const uniqueNumbers = new Set([1, 2, 4, 6]);Finalmente obtenemos la diferencia entre ambos conjuntos, para esto utilizamos el método difference que creamos previamente:
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
// const missingNumbers = [1, 2, 3, 4, 5, 6].difference([1, 2, 4, 6]);
// const missingNumbers = [3, 5];
const missingNumbers = [3, 5];difference lo que hace es obtener la diferencia entre ambos conjuntos, es decir, los números que están en el primer conjunto pero no en el segundo. Por ejemplo: la diferencia de elementos que esta en fullSetOfNumbers pero no en uniqueNumbers, es decir, si fullSetOfNumbers es [1, 2, 3, 4, 5, 6] y uniqueNumbers es [1, 2, 4, 6], entonces la diferencia es [3, 5], que son los números faltantes.
Y devolvemos un array con los números faltantes:
return [...missingNumbers];
// return [3, 5];
return [3, 5];Así es como resolví este reto utilizando diferencia de conjuntos 🎉