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
Diagramas de flujo


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}")Ejecútalo en el navegador
▶ Visualízalo paso a paso en Python Tutor — ve cómo cambian las variables línea a línea.
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.