给定一个以字符串表示的非负整数 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。
class Solution(object):
def removeKdigits(self, num, k):
"""
:type num: str
:type k: int
:rtype: str
刚开始的时候,以为这道题,就是讲一串字符串中的数字比较大的k个数去掉即可,但是发现,去掉K个
比较大的数,并不能保证,剩余的数组成的是最小的数。就比如示例了中
num = ‘1432219’ k = 3
如果去掉最大的三个数, 9,4,3 剩余的是 1221
没有去掉 4,3,2 剩余的是 1219小
所以,这道题不能依据去掉最大的数来考虑。
"""
if len(num) > 10002 or len(num) <k:
return False
if len(num) == k:
return '0'
stack = []
# 先移除左边比右边大的数
for i in num:
while stack and i < stack[-1] and k>0:
stack.pop()
k-=1
stack.append(i)
#如果左边没有比右边的大,那就自己从最后移除
if k>0:
stack = stack[:-k]
#前面有0 去掉0
while stack and stack[0] =='0':
stack.pop(0)
#如果stack里面没有值,返回0, 如果有就将stack转换为str返回
if not stack:
return "0"
else:
return ''.join(stack)
成功
执行用时: 52 ms, 在Remove K Digits的Python提交中击败了68.97% 的用户
内存消耗: 10.9 MB, 在Remove K Digits的Python提交中击败了0.00% 的用户