Sitio web de preguntas de pincel: Leetcode
Dificultad: fácil
Idioma: pitón
Plan : De fácil -> a medio -> a difícil.
1. La primera versión incorrecta de 278
1.1 Descripción del problema
Suponga que en el desarrollo de versiones, todas las versiones posteriores a la versión incorrecta son incorrectas. Hay n
una versión [1,2,...,n]
, si desea encontrar la primera versión incorrecta que provocó que fallaran todas las versiones posteriores.
bool isBadVersion(version)
Puede juzgar si el número de versión version
es incorrecto en las pruebas unitarias llamando a la interfaz. La implementación de una función para encontrar la primera versión incorrecta debería minimizar la cantidad de llamadas a la API.
- Ejemplo 1
输入:n=5,bad=4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
- Ejemplo 2
输入:n = 1, bad = 1
输出:1
1.2 Pensamiento y análisis
Al principio, es fácil malinterpretar el significado del título o no entender el título. Tenga en cuenta los dos puntos siguientes:
- 1) Por ejemplo, el número de versión
[1,2,3,...n]
se expresa en forma de correcto e incorrecto[********######]
, lo que*
significa un#
número de versión correcto e incorrecto, y el título requiere la posición de la primera aparición#
. - 2)
isBadVersion(3) -> false
El significado de esta oración no es simplementefalse
entender que está mal, sinoisBadVersion()
juzgar si está mal. Sifalse
la doble negación es igual a la afirmación, entonces esta oración significa que la versión es correcta, de lo contrarioisBadVersion(4) -> ture
significa que la cuarta el número de versión es incorrecto.
Después de comprender el significado de la pregunta, podemos escribir el código correspondiente. Esta pregunta también es un método de clasificación binaria, similar a la búsqueda binaria de la matriz 704 anterior .
1.3 Proceso de resolución de problemas
En primer lugar, la consola da el código inicial, solo necesitamos escribirlo más tarde.
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
Esta pregunta ya ha dicho que la isBadVersion API
interfaz está definida, asumimos que ya existe y no hay necesidad de definirla nosotros mismos. Por lo tanto, esta pregunta no se puede depurar en pycharm, pero solo se puede depurar localmente en leetcode.
- (1) En primer lugar, a diferencia del método anterior, aquí no se usa el índice de subíndice, sino el número de versión de 1 a n directamente, por lo que debemos definir el valor inicial del extremo izquierdo en 1
left=1
- (2) Luego, necesitamos un ciclo para determinar si es la ubicación del primer error. Tenga en cuenta que las condiciones para el establecimiento del bucle no se pueden escribir
left<=n
, pero deben escribirseleft<n
. De lo contrario, caerá en un bucle infinito y excederá el límite de tiempo, es decir, para garantizar que haya al menos dos números de versión.
while left<n:
- (3) Finalmente, debe agregar una declaración de juicio para llamar si la interfaz es
true
. Al principio, no sabía cómo llamarloisBadVersion() API
, así que directamente imité el título y lo escribí.
if isBadVersion() -> true:
\qquadPero después de la ejecución, siempre muestra el siguiente error
SyntaxError: invalid syntax
\qquadCuando lo ->
cambié a común, recibí el ==
siguiente error
NameError:name'ture' is not defined
\qquadDespués, después de pensarlo isBadVersion()
, ya está definido, por lo que no debería haber ningún problema, es decir, hay un problema después. Piense en la if
declaración después de que se establezca la condición y luego ejecútela. Por lo tanto, simplemente quité la parte posterior y lo logré.
if isBadVersion():
- (4) El código final es el siguiente
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
left = 1
while left<n:
mid = (n-left)//2 + left
if isBadVersion(mid):
n = mid
else:
left = mid + 1
return left
Los resultados de la ejecución son los siguientes: el
95,9% de los usuarios son derrotados, por lo que el algoritmo no debe ser malo.Otros pueden tener configuraciones diferentes para cada computadora, lo que resulta en un tiempo diferente.
1.4 Resumen
El objetivo de esta pregunta es entender el significado de la pregunta. No lo entendí al principio, pero solo después de leer los comentarios supe API
el significado de llamar a la interfaz. La idea del algoritmo sigue siendo el método de búsqueda binaria, que es ligeramente diferente al anterior, es mejor prestar más atención y practicar más.