Leetcode 402. 移掉K位数字 Python3实现(超详细注释!)

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
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值