leetcode402. 移掉K位数字

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

注意:

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

示例 1 :

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

示例 2 :

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

数学原理及其思想:

假设原数为A,有n为,那么我们表示为:

A=a1*10^(n-1)+a2*10^(n-2)...ak-1*10^(n-k+1)+ak*10^(n-k)+....an

B为去掉第k位的数字,表示为

B=a1*10^(n-2)+a2*10^(n-3)...ak-1*10^(n-k)+_+...an

其中下划线表示第k个数字已经删除。

扫描二维码关注公众号,回复: 2271790 查看本文章

如果我们删除这个数字后B最小,那么相应的A-B应该最大。

A-B=a1*10^(n-1)+(a2-a1)*10^(n-2)...(ak-ak-1)*10^(n-k)

为了使这个数字尽可能的大我们要a2-a1,a3-a2....ak-ak-1都是正的也就是后一位大于前一位

所以在数字序列中,一旦发现num【k】>num【k+1】就应该删除num【k】,

这让我想起了“递减栈”。

栈的弹出代表删除,最终只要弹出k次就能得到正确结果。

代码如下:

class Solution:
    def safe_int(self,n):
        if n:
            return int(n)
        else:
            return 0
    def removeKdigits(self, num, k):
        stk=[]
        n=k
        for c in num:
            if len(stk)==0 or stk[-1]<=c:
                stk.append(c)
            elif stk[-1]>c:
                while k>0 and len(stk)>0 and stk[-1]>c:
                    stk.pop()
                    k-=1
                stk.append(c)
            elif k==0:
                stk.append(c)
        return str(self.safe_int("".join(stk[:len(stk)-k])))

其中safe_int是一个安全转换函数,防止str转int时出现空串现象。

自己还是太弱了。。。。。。。


猜你喜欢

转载自blog.csdn.net/weixin_37373020/article/details/81005406