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.