给定一个以字符串表示的非负整数 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