LeetcodeMedium- [402. Eliminar K dígitos]

Dado un número entero no negativo representado por una cadena, elimine el número de k dígitos de este número para que el número restante sea el más pequeño.

Nota:

La longitud de num es menor que 10002 y ≥ k.
num no contendrá ceros a la izquierda.
Ejemplo 1:

Entrada: num = "1432219", k = 3
Salida: "1219"
Explicación: Quite los tres números 4, 3 y 2 para formar un nuevo número más pequeño 1219.


Ejemplo 2

Entrada: num = "10200", k = 1
Salida: "200"
Explicación: Elimine el primer 1 y el número restante es 200. Tenga en cuenta que la salida no puede tener ceros a la izquierda.


Ejemplo 3

Entrada: num = "10", k = 2
Salida: "0"
Explicación: Elimine todos los dígitos de los dígitos originales, y el nulo restante es 0.

Fuente: LeetCode (LeetCode)
enlace: https://leetcode-cn.com/problems/remove-k-digits los
derechos de autor pertenecen a la red de deducción. Comuníquese con la autorización oficial para la reimpresión comercial e indique la fuente de la reimpresión no comercial.

Idea: https://leetcode-cn.com/problems/remove-k-digits/solution/yi-diao-kwei-shu-zi-by-leetcode/

Las reglas anteriores nos hacen acercarnos gradualmente a la solución óptima eliminando los números uno por uno.

Este problema se puede resolver con un algoritmo codicioso. Las reglas anteriores aclaran la lógica básica de cómo abordamos la respuesta final. Una vez que eliminamos un número de la secuencia, los números restantes forman un nuevo problema, y ​​podemos continuar usando esta regla.

Notaremos que en algunos casos, la regla no se aplica a ningún número, es decir, una secuencia monotónicamente creciente. En este caso, solo necesitamos eliminar el número al final para obtener el número mínimo.

Podemos usar la pila para implementar el algoritmo anterior, almacenando el número antes del número de iteración actual.

Para cada número, si el número es menor que la parte superior de la pila, que es el vecino izquierdo del número, se abre la pila, es decir, se elimina el vecino izquierdo. De lo contrario, empujamos el número a la pila.
Repetimos el paso anterior (1) hasta que ya no se aplique ninguna condición, por ejemplo, la pila está vacía (no se conservan más números). O hemos eliminado k dígitos.


Demostramos el principio de funcionamiento de este algoritmo en la figura anterior. Dada la secuencia de entrada [1,2,3,4,5,2,6,4] yk = 4, la regla se activa en 5. Después de eliminar el número 5, la regla se activará nuevamente en el número 4 hasta el número 3. Luego, en el número 6, la regla también se activa.

Fuera del ciclo principal anterior, tenemos que lidiar con algunas situaciones para que la solución sea más completa:

Cuando salimos del bucle principal, eliminamos m dígitos, que era menos de lo requerido, es decir (m <k). En casos extremos, no eliminaremos ninguna cantidad de secuencias que aumenten monotónicamente en el ciclo, es decir, m == 0. En este caso, solo necesitamos eliminar los dígitos de km adicionales del final de la secuencia.
Una vez que eliminamos el número de k bits de la secuencia, puede haber algunos ceros a la izquierda. Para formatear el último número, necesitamos eliminar los ceros iniciales.
Eventualmente podemos eliminar todos los números de la secuencia. En este caso, deberíamos devolver cero, no una cadena vacía.

 

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        stack = []
        for i in range(len(num)):
            if stack == []:
                stack.append(num[i])
                continue
            elif int(num[i]) < int(stack[-1]) and k > 0:
                # 一直往前弹出
                while stack != [] and int(num[i]) < int(stack[-1]) and k > 0:
                    stack.pop()
                    k -= 1
            stack.append(num[i])
        # print(stack)
        while k > 0: 
            stack.pop()
            k -= 1
        if stack == []:
            return "0"
        return str(int(''.join(stack)))
        
class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        numStack = []
        
        # Construct a monotone increasing sequence of digits
        for digit in num:
            while k and numStack and numStack[-1] > digit:
                numStack.pop()
                k -= 1
        
            numStack.append(digit)
        
        # - Trunk the remaining K digits at the end
        # - in the case k==0: return the entire list
        finalStack = numStack[:-k] if k else numStack
        
        # trip the leading zeros
        return "".join(finalStack).lstrip('0') or "0"

作者:LeetCode
链接:https://leetcode-cn.com/problems/remove-k-digits/solution/yi-diao-kwei-shu-zi-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Publicado 314 artículos originales · 22 alabanzas · Más de 20,000 visitas

Supongo que te gusta

Origin blog.csdn.net/qq_39451578/article/details/105081058
Recomendado
Clasificación