Ejercicio 02 — Devuelve True si algun valor aparece al menos dos veces en nums
Dificultad: verde · Módulo 09 (Puente a NeetCode)
Enunciado
devuelve True si algun valor aparece al menos dos veces en nums
Cómo se resuelve
Detectar duplicados es el ejemplo más limpio del patrón “set de elementos ya vistos”: convertir una búsqueda repetida en una consulta O(1).
vistos = set()— un conjunto vacío. La pertenencia (in) en un set es O(1) porque usa tabla hash, igual que un dict pero sin valores asociados.- En
for n in numsrecorremos una vez.if n in vistos: return Truecorta en cuanto encontramos algo repetido, sin seguir mirando el resto. vistos.add(n)registra el número actual. Recorrer + consultar da O(n) tiempo y O(n) espacio, frente a los O(n^2) de comparar cada elemento con todos los demás.- La versión bonus
len(nums) != len(set(nums))explota que un set descarta duplicados al construirse: si el conjunto encoge, es que había repetidos. Es elegante, pero siempre recorre la lista entera; la versión explícita puede salir antes.
Trampa habitual: pensar que ordenar primero y comparar vecinos es igual de bueno. Ordenar cuesta O(n log n), peor que el O(n) del set, y además modifica el orden. El set gana en tiempo a cambio de memoria.
Para practicar — cópialo y complétalo
Pega este esqueleto y completa los TODO. Es la mejor forma de aprender: inténtalo antes de mirar la solución.
# Curso de Python — Modulo 09: Puente a NeetCode
# Ejercicio 02 — PRACTICA (rellena los TODO)
# Enunciado: devuelve True si algun valor aparece al menos dos veces en nums
# Dificultad: verde
# Ejecutar: python3 ej02_practica.py
# PISTA: un set solo guarda elementos unicos. Recorre la lista;
# si el elemento ya esta en el set, es un duplicado.
def contains_duplicate(nums: list) -> bool:
"""Devuelve True si hay algun duplicado en nums."""
# TODO 1: crea un set vacio llamado 'vistos'
vistos = ...
for n in nums:
# TODO 2: comprueba si n ya esta en 'vistos'
if ...:
# TODO 3: si esta, devuelve True (duplicado encontrado)
...
# TODO 4: si no esta, anade n al set con .add()
...
# TODO 5: si terminas el bucle sin encontrar duplicado, devuelve False
return ...
# --- Pruebas (no toques esta parte) ---
if __name__ == "__main__":
casos = [
([1, 2, 3, 1], True),
([1, 2, 3, 4], False),
([1, 1, 1, 3, 3, 4, 3, 2, 4, 2], True),
]
for nums, esperado in casos:
resultado = contains_duplicate(nums)
estado = "OK" if resultado == esperado else "FALLO"
print(f"[{estado}] contains_duplicate({nums}) = {resultado} (esperado {esperado})")Solución — cópiala y ejecútala
# Curso de Python — Modulo 09: Puente a NeetCode
# Ejercicio 02 — MODELO (resuelto)
# Enunciado: devuelve True si algun valor aparece al menos dos veces en nums
# Dificultad: verde
# Ejecutar: python3 ej02_modelo.py
# PATRON: set como coleccion de elementos ya vistos.
# Un set no guarda duplicados; si intentas insertar uno que ya existe,
# el set no cambia. Aprovechamos eso: comprueba antes de insertar.
# Coste: O(n) tiempo, O(n) espacio.
#
# Alternativa ultracorta: len(nums) != len(set(nums))
# La mostramos como bonus despues de la version explicita.
def contains_duplicate(nums: list) -> bool:
"""Devuelve True si hay algun duplicado en nums."""
vistos = set()
for n in nums:
if n in vistos:
return True # duplicado encontrado
vistos.add(n)
return False
def contains_duplicate_bonus(nums: list) -> bool:
"""Version compacta: si el set es mas pequeno, hubo duplicados."""
return len(nums) != len(set(nums))
# --- Pruebas manuales ---
if __name__ == "__main__":
casos = [
([1, 2, 3, 1], True),
([1, 2, 3, 4], False),
([1, 1, 1, 3, 3, 4, 3, 2, 4, 2], True),
]
for nums, esperado in casos:
r1 = contains_duplicate(nums)
r2 = contains_duplicate_bonus(nums)
e1 = "OK" if r1 == esperado else "FALLO"
e2 = "OK" if r2 == esperado else "FALLO"
print(f"[{e1}] explicita: {r1} [{e2}] bonus: {r2} nums={nums}")Cómo usarlo
Pega el código en un fichero y ejecútalo con tu toolchain habitual (o el botón de Ejecutar de tu editor). Antes de mirar la solución, intenta completar tú el esqueleto: es la mejor forma de aprender.