Leetcode 402. 移掉K位数字 Python3实现
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。加了详细的注释,方便日后复习,也希望能帮到其他小伙伴,如有错误,欢迎指正!
Python3代码如下:
class Solution:
def removeKdigits(self, num: str, k: int):
# 若num的长度小于或等于k,那么最后结果肯定是0
if len(num) <= k:
return "0"
# 定义一个栈,用来存储需要保留的数字
stack = []
# 从头到尾循环遍历num中的每一个数字,判断是否要保留这个数字
for i in num:
# 满足三个条件才把栈顶的元素删除:仍需要删除数字(k>0)、stack不为空、栈顶的数字大于当前遍历到的数字
# ps:这里要注意,只要满足这三个条件,是会一直删除栈顶的数字的,即当前遍历的数字如果很小并且前两个条件也满足会一直删除数字
while k > 0 and stack and i < stack[-1]:
stack.pop() # 弹出栈顶元素(也就是当前数字的最后一位)
k -= 1 # 每次删除数字后,k都需要减1
stack.append(i) # 将当前遍历到的数字入栈
# 到这一步说明栈中的元素已经单调递增了
# 但是可能删除的数字数量还不够,由于这时候栈中的数字单调递增,所以我们可以一个个弹出元素即可
while k > 0:
stack.pop()
k -= 1
# 将栈拼接成字符串,但是要注意这里有可能数字是0打头的,我们直接把左数非0数组之前的0全部删除
result = ''.join(stack).lstrip("0")
# 但是这里又有问题了,有可能删除后结果为空字符串,显然这种情况我们需要的结果为0,所以我们需要加一个判断
if result == "":
return "0"
else:
return result