移掉K位数字---LeetCode----(19)

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

注意:git

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

示例 1 :数组

输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 造成一个新的最小的数字 1219。

示例 2 :app

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

示例 3 :code

输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除全部的数字,剩余为空就是0。

 

 

class Solution(object):
    def removeKdigits(self, num, k):
        """
        :type num: str
        :type k: int
        :rtype: str
        刚开始的时候,觉得这道题,就是讲一串字符串中的数字比较大的k个数去掉便可,可是发现,去掉K个
        比较大的数,并不能保证,剩余的数组成的是最小的数。就好比示例了中
        num = ‘1432219’ k = 3
        若是去掉最大的三个数, 9,4,3  剩余的是 1221
        没有去掉  4,3,2 剩余的是 1219小
        因此,这道题不能依据去掉最大的数来考虑。
        
        """
        if len(num) > 10002 or len(num) <k:
            return False
        if len(num) == k:
            return '0'
            
        stack = []
        # 先移除左边比右边大的数
        for i in num:
            while stack and i < stack[-1] and k>0:
                stack.pop()
                k-=1
            stack.append(i)
        #若是左边没有比右边的大,那就本身从最后移除
        if k>0:
            stack = stack[:-k]
        #前面有0 去掉0
        while stack and stack[0] =='0':
            stack.pop(0)
        #若是stack里面没有值,返回0, 若是有就将stack转换为str返回
        if not stack:
            return "0"
        else:
            return  ''.join(stack)

 

成功内存

显示详情 leetcode

执行用时: 52 ms, 在Remove K Digits的Python提交中击败了68.97% 的用户rem

内存消耗: 10.9 MB, 在Remove K Digits的Python提交中击败了0.00% 的用户字符串