Skip to content

Commit 4dbaa1b

Browse files
committed
✨ Add challenge-23 solution
1 parent 32b628e commit 4dbaa1b

File tree

3 files changed

+155
-0
lines changed

3 files changed

+155
-0
lines changed
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
# Reto 23: Encuentra-los-numeros-perdidos
2+
3+
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**!
4+
5+
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).
6+
7+
Eso sí, ten en cuenta que:
8+
9+
- Los números pueden aparecer más de una vez y otros pueden faltar
10+
- El array siempre contiene números enteros positivos
11+
- Siempre se empieza a contar desde el 1
12+
13+
```js
14+
findMissingNumbers([1, 2, 4, 6])
15+
// [3, 5]
16+
17+
findMissingNumbers([4, 8, 7, 2])
18+
// [1, 3, 5, 6]
19+
20+
findMissingNumbers([3, 2, 1, 1])
21+
// []
22+
23+
findDisappearedNumbers([5, 5, 5, 3, 3, 2, 1])
24+
// [4]
25+
```
26+
27+
## Mi solución explicada
28+
29+
```js
30+
function findMissingNumbers(nums) {
31+
const maxNumber = Math.max(...nums);
32+
const fullSetOfNumbers = new Set(
33+
Array.from({ length: maxNumber }, (_, index) => index + 1),
34+
);
35+
const uniqueNumbers = new Set(nums);
36+
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
37+
return [...missingNumbers];
38+
}
39+
```
40+
41+
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.
42+
43+
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.
44+
45+
**Veamos un ejemplo**:
46+
47+
Supongamos que tenemos el siguiente array:
48+
49+
```js
50+
const nums = [1, 2, 4, 6];
51+
```
52+
53+
Primero obtenemos el número más alto del array, en este caso es el número 6:
54+
55+
```js
56+
const maxNumber = Math.max(...nums);
57+
// const maxNumber = Math.max(...[1, 2, 4, 6]);
58+
// const maxNumber = Math.max(1, 2, 4, 6);
59+
const maxNumber = 6;
60+
```
61+
62+
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:
63+
64+
```js
65+
const fullSetOfNumbers = new Set(
66+
Array.from({ length: maxNumber }, (_, index) => index + 1),
67+
);
68+
69+
// Array.from({ length: 6 }, (_, index) => index + 1);
70+
// Array.from([undefined, undefined, undefined, undefined, undefined, undefined], (_, index) => index + 1);
71+
// [1, 2, 3, 4, 5, 6]
72+
73+
// new Set([1, 2, 3, 4, 5, 6]);
74+
75+
const fullSetOfNumbers = new Set([1, 2, 3, 4, 5, 6]);
76+
```
77+
78+
Después creamos un conjunto con los números únicos del array, para este caso utilizamos `Set`:
79+
80+
```js
81+
const uniqueNumbers = new Set(nums);
82+
// const uniqueNumbers = new Set([1, 2, 4, 6]);
83+
const uniqueNumbers = new Set([1, 2, 4, 6]);
84+
```
85+
86+
Finalmente obtenemos la diferencia entre ambos conjuntos, para esto utilizamos el método `difference` que creamos previamente:
87+
88+
```js
89+
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
90+
// const missingNumbers = [1, 2, 3, 4, 5, 6].difference([1, 2, 4, 6]);
91+
// const missingNumbers = [3, 5];
92+
const missingNumbers = [3, 5];
93+
```
94+
95+
`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.
96+
97+
Y devolvemos un array con los números faltantes:
98+
99+
```js
100+
return [...missingNumbers];
101+
// return [3, 5];
102+
return [3, 5];
103+
```
104+
105+
Así es como resolví este reto utilizando diferencia de conjuntos 🎉
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
function findMissingNumbers(nums) {
2+
const maxNumber = Math.max(...nums);
3+
const fullSetOfNumbers = new Set(
4+
Array.from({ length: maxNumber }, (_, index) => index + 1),
5+
);
6+
const uniqueNumbers = new Set(nums);
7+
const missingNumbers = fullSetOfNumbers.difference(uniqueNumbers);
8+
return [...missingNumbers];
9+
}
10+
11+
module.exports = findMissingNumbers;
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
const findMissingNumbers = require('./index');
2+
3+
describe('23 => Encuentra-los-numeros-perdidos', () => {
4+
const TEST_CASES = [
5+
{
6+
input: [1, 2, 4, 6],
7+
output: [3, 5],
8+
},
9+
{
10+
input: [4, 8, 7, 2],
11+
output: [1, 3, 5, 6],
12+
},
13+
{
14+
input: [3, 2, 1, 1],
15+
output: [],
16+
},
17+
{
18+
input: [5, 5, 5, 3, 3, 2, 1],
19+
output: [4],
20+
},
21+
{
22+
input: [1, 2, 3, 4, 5],
23+
output: [],
24+
},
25+
];
26+
27+
it('should return an array', () => {
28+
const result = findMissingNumbers([1, 2, 4, 6]);
29+
expect(Array.isArray(result)).toBe(true);
30+
});
31+
32+
it.each(TEST_CASES)(
33+
'should return the missing numbers',
34+
({ input, output }) => {
35+
const result = findMissingNumbers(input);
36+
expect(result).toEqual(output);
37+
},
38+
);
39+
});

0 commit comments

Comments
 (0)