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).

  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.
  2. En for n in nums recorremos una vez. if n in vistos: return True corta en cuanto encontramos algo repetido, sin seguir mirando el resto.
  3. 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.
  4. 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.

Conexiones