leetcode_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。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-k-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#暴力:O(n*k)
class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        #如果前面的数大于后面的数,则删除,否则是递增,删除最后一个
        for i in range(k):
            for j in range(len(num)):
                if j<len(num)-1 and num[j]>num[j+1]:
                    num=num[:j]+num[j+1:]
                    break
                if j==len(num)-1:
                    num=num[:j]
        i=0
        #删除前面的‘0’
        for x in num:
            if x=='0':
                i+=1
            else:
                break
        num=num[i:]
        if num=='' :num='0'
        return num
#方法2:利用栈(列表模拟)O(n)
#考虑从左往右增量的构造最后的答案。我们可以用一个栈维护当前的答案序列,栈中的元素代表截止到当前位置,删除不超过 k次个数字后,所能#得到的最小整数。根据之前的讨论:在使用 k个删除次数之前,栈中的序列从栈底到栈顶单调不降。
#因此,对于每个数字,如果该数字小于栈顶元素,我们就不断地弹出栈顶元素,直到
#栈为空或者新的栈顶元素不大于当前数字或者我们已经删除了 k 位数字
class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        a=[]
        for x in num:
            while k and a and a[-1]>x:
                k-=1
                a.pop()
            a.append(x)
        while k>0:
            a.pop()
            k-=1
        s=''.join(a)
        s=s.lstrip('0')
        if s=='':s='0'
        return s
posted @ 2020-11-15 14:22  hqzxwm  阅读(80)  评论(0编辑  收藏  举报