美文网首页leetcode
402. 移掉K位数字

402. 移掉K位数字

作者: 十月里的男艺术家 | 来源:发表于2020-02-21 16:21 被阅读0次

    题目:

    402. 移掉K位数字

    给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

    注意:

    • num 的长度小于 10002 且 ≥ k。
    • num 不会包含任何前导零。

    示例 1 :

    输入: num = "1432219", k = 3

    输出: "1219"

    解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。

    示例 2 :

    输入: num = "10200", k = 1

    输出: "200"

    解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。

    示例 3 :

    输入: num = "10", k = 2

    输出: "0"

    解释: 从原数字移除所有的数字,剩余为空就是0。

    思路:

    从左向右扫描num中每一个数字,新的数字大于栈顶元素,弹出栈顶元素,直到栈顶元素小于新的数字,然后入栈新的数字。

    代码:

    class Solution:
        def removeKdigits(self, num: str, k: int) -> str:
            stack = list()
            for n in num:
                while k and stack and stack[-1] > n:
                    stack.pop()
                    k -= 1
                stack.append(n)
    
            return ''.join(stack[:(-k or None)]).lstrip('0') or '0'
    
    package leet00402
    
    func removeKdigits(num string, k int) string {
        digits := len(num) - k
        stack := make([]byte, len(num))
        top := 0
    
        for i := range num {
            for top > 0 && stack[top-1] > num[i] && k > 0 {
                top--
                k--
            }
            stack[top] = num[i]
            top++
        }
    
        i := 0
        for i < digits && stack[i] == '0' {
            i++
        }
    
        if i == digits {
            return "0"
        }
        return string(stack[i:digits])
    }
    
    

    相关文章

      网友评论

        本文标题:402. 移掉K位数字

        本文链接:https://www.haomeiwen.com/subject/ksncqhtx.html