Python - Encuentra el número perdido en la secuencia numérica

CorePress2024-01-24  10

Está bien, básicamente todo lo que tengo que hacer es encontrar un número perdido en secuencia.

Para los datos de entrada:

5
2 3 1 5

La respuesta correcta es

4
def findMissing(n):
    
    tempList = []
    for i in range(0, n-1):
        tempList.append(str(input()))
    return [x for x in range(tempList[0], tempList[-1]+1) if x not in tempList] 
    

findMissing(5)

Salida:

---> 11     return [x for x in range(tempList[0], tempList[-1]+1) if x not in tempList]

TypeError: must be str, not int

He intentado algo así, quería crear una lista y la entrada aparecía en esa lista, luego devolveré el valor faltante de esa lista, pero no funciona.

el rango toma enteros, no cadenas

- C.Nivs

26/03/2021 a las 19:33

input() ya te proporciona una cadena; deseas convertirla en un int.

- Samsagaz

26/03/2021 a las 19:34

¿Esto responde a tu pregunta? Obtenga una lista de números como entrada del usuario

-001

26/03/2021 a las 19:35

Gracias @Samwiseresolvió mi problema y ¡también mi código está funcionando!

- KermitLaRana

26/03/2021 a las 19:36

suma(1...n) = n*(n+1)/2. Así que simplemente suma los números que obtienes de la entrada y resta de suma(1...n)

- inspectorG4dget

26/03/2021 a las 19:38



------------------------------------

Este error en realidad proviene de este paso:

tempList[-1]+1

La forma de reproducir esto sería:

'1' + 1
TypeError: must be str, not int

Necesitas agregar tipos similares. Puedes arreglarlo haciendoing int(input()) que convertirá el tipo de cadena en un int.

el rango también arrojará un error en los argumentos str:

range('1', '3')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'str' object cannot be interpreted as an integer

Así que asegúrese de darle argumentos enteros.



------------------------------------

Podrías generar un conjunto de archivos "completos" secuencia usando el rango y luego toma set.difference con la lista de datos proporcionada, entonces eso debería contener el elemento que falta.

def findMissing(n, data):
    return set(range(1, n+1)).difference(data).pop()

>>> findMissing(5, [2, 3, 1, 5])
4

Como sabes que la secuencia es contigua, también puedes hacer esto aritméticamente

def findMissing(n, data):
    return sum(range(1,n+1)) - sum(data)

>>> findMissing(5, [2, 3, 1, 5])
4

7

Y también tengo una pregunta: ¿cuál es la complejidad temporal de este?

- KermitLaRana

26/03/2021 a las 19:37

@Daro1234451 Es probable que el poste largo de la tienda esté configurado. La diferencia que, según la implementación típica, es O(n)

- Cory Kramer

26/03/2021 a las 19:38

También tengo otra pregunta: ¿cuál será la solución O(1)?

- KermitLaRana

26/03/2021 a las 19:41

2

@Daro1234451 No existe una solución O(1)

- Cory Kramer

26/03/2021 a las 19:42

No sé exactamente por qué, pensé que O(n) estaría en el caso.Usaré el bucle for o iteraré sobre algo, pero ¿incluso ahí? También pensé que las operaciones set y pop funcionan en complejidad O(1). ¿Te importaría explicarme?

- KermitLaRana

26/03/2021 a las 20:05



------------------------------------

Otra variante de la respuesta de @Cory Kramer usando una diferencia simétrica establecida:

def find_missing(number, data):
    return (set(data) ^ set(range(1, number + 1))).pop()

find_missing(5, [2, 3, 1, 5])

>> 4

Consulta la documentación oficial para obtener más información.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare