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个数字已经删除。

如果我们删除这个数字后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时出现空串现象。

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值