给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
- 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时出现空串现象。
自己还是太弱了。。。。。。。