Skip to content

Latest commit

 

History

History
113 lines (81 loc) · 4.18 KB

File metadata and controls

113 lines (81 loc) · 4.18 KB

Reto 23: Encuentra-los-numeros-perdidos

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]

Mi solución explicada

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 🎉