1-valores duplicados en un arreglo
Debes encontrar valores duplicados en un arreglo de números enteros y
regresar un arreglo con los números que se repitan exactamente 2 veces. Prueba tu algoritmo para los siguientes casos:
[4,3,2,7,8,3,1]=[32]
[1,1,2] = [1]
[1]=[]
¿Qué es un arreglo?
Un arreglo (o array) es una estructura de datos que almacena una colección de elementos en un orden específico. Piensa en él como una lista ordenada donde cada elemento tiene una posición numerada.
Características principales:
Elementos: Pueden ser números, texto, objetos, etc.
Índices: Cada elemento tiene una posición (empezando desde 0)
Orden: Los elementos mantienen el orden en que fueron agregados
Ejemplo visual:
// Arreglo de números
let numeros = [4, 3, 2, 7, 8, 3, 1];
// Posiciones (índices):
// índice: 0 1 2 3 4 5 6
// valor: 4 3 2 7 8 3 1Acceso a elementos:
console.log(numeros[0]); // 4 (primer elemento)
console.log(numeros[1]); // 3 (segundo elemento)
console.log(numeros[5]); // 3 (sexto elemento)Nuestro arreglo ejemplo:
Vamos a usar este arreglo para explicar el problema:
let arregloEjemplo = [4, 3, 2, 7, 8, 3, 1];Análisis del arreglo:
Elementos únicos: 4, 2, 7, 8, 1 (aparecen 1 vez)
Elemento duplicado: 3 (aparece 2 veces)
Total de elementos: 7
¿Qué queremos hacer con este arreglo?
Queremos encontrar qué números aparecen exactamente 2 veces. En este caso:
El número 3 aparece en las posiciones 1 y 5 → 2 veces
Todos los demás aparecen 1 vez
Resultado esperado: [3]
Proceso paso a paso:
Recorrer el arreglo:
[4, 3, 2, 7, 8, 3, 1]Contar apariciones:
4 → 1 vez
3 → 2 veces ✓
2 → 1 vez
7 → 1 vez
8 → 1 vez
1 → 1 vez
Seleccionar: Solo el número 3 tiene exactamente 2 apariciones
¿Te queda claro qué es un arreglo y cómo vamos a trabajar con él?
Análisis del problema
Necesitamos encontrar números que aparezcan exactamente 2 veces en el arreglo, no más ni menos.
Estrategia de solución
Contar frecuencia: Contar cuántas veces aparece cada número
Filtrar resultados: Seleccionar solo los números que aparecen exactamente 2 veces
Solución en JavaScript
function encontrarDuplicadosExactos(arr) {
// Paso 1: Contar frecuencia de cada número
const frecuencia = {};
for (let num of arr) {
frecuencia[num] = (frecuencia[num] || 0) + 1;
}
// Paso 2: Filtrar números que aparecen exactamente 2 veces
const resultado = [];
for (let num in frecuencia) {
if (frecuencia[num] === 2) {
resultado.push(Number(num));
}
}
return resultado;
}Versión más concisa (usando Map)
function encontrarDuplicadosExactos(arr) {
const frecuencia = new Map();
// Contar frecuencia
for (let num of arr) {
frecuencia.set(num, (frecuencia.get(num) || 0) + 1);
}
// Filtrar y retornar
return Array.from(frecuencia.entries())
.filter(([num, count]) => count === 2)
.map(([num]) => num);
}Prueba de los casos
// Caso 1
console.log(encontrarDuplicadosExactos([4,3,2,7,8,3,1])); // [3]
console.log(encontrarDuplicadosExactos([1,1,2])); // [1]
console.log(encontrarDuplicadosExactos([1])); // []
// Casos adicionales para probar
console.log(encontrarDuplicadosExactos([1,2,3,4,5])); // []
console.log(encontrarDuplicadosExactos([1,1,2,2,3,3,3])); // [1,2]
console.log(encontrarDuplicadosExactos([1,1,1,2,2])); // [2]Explicación detallada
Contar frecuencia: Usamos un objeto o Map para almacenar cuántas veces aparece cada número
Filtrar: Recorremos el objeto de frecuencias y seleccionamos solo los números con valor
2Retornar: Convertimos los resultados a un arreglo
Complejidad
Tiempo: O(n) - recorremos el arreglo una vez
Espacio: O(n) - almacenamos las frecuencias en un objeto/Map
Desglose de la línea
frecuencia[num] = (frecuencia[num] || 0) + 1;Vamos a dividirla en partes:
1.
frecuencia[num]Accede al valor almacenado en el objeto
frecuenciapara la clavenumSi la clave no existe, devuelve
undefined
2. frecuencia[num] || 0
El operador
||(OR lógico) funciona así:Si
frecuencia[num]tiene un valor truthy (diferente de 0, null, undefined, false, "", NaN), usa ese valorSi es falsy (especialmente
undefinedcuando la clave no existe), usa0
3. (...) + 1
Toma el resultado del paso anterior y le suma 1
4. Asignación
Asigna el nuevo valor de vuelta a
frecuencia[num]
Ejemplo paso a paso
Arreglo: [1, 1, 2]
Iteración 1 (num = 1):
frecuencia[1]esundefined(no existe)undefined || 0=00 + 1=1frecuencia[1] = 1
Iteración 2 (num = 1):
frecuencia[1]es11 || 0=11 + 1=2frecuencia[1] = 2
Iteración 3 (num = 2):
frecuencia[2]esundefinedundefined || 0=00 + 1=1frecuencia[2] = 1
Equivalente más explícito
// Esta línea:
frecuencia[num] = (frecuencia[num] || 0) + 1;
// Es equivalente a:
if (frecuencia[num] === undefined) {
frecuencia[num] = 1; // Primera vez que aparece
} else {
frecuencia[num] = frecuencia[num] + 1; // Incrementar contador
}¿Por qué usar este patrón?
Conciso: Una línea en lugar de 4-5
Elegante: Maneja el caso "no existe" de forma compacta
Común: Patrón muy usado en JavaScript para contadores
Versiones alternativas
Usando operador nullish coalescing (??):
frecuencia[num] = (frecuencia[num] ?? 0) + 1;Usando if explícito:
if (!frecuencia[num]) {
frecuencia[num] = 1;
} else {
frecuencia[num]++;
}¿Queda claro cómo funciona esta línea?
Comentarios
Publicar un comentario