leetcode每日一题—402.移掉K位数字

题目:
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。

注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
在这里插入图片描述
思路:
为了让大家对该题有个清晰的认识,可以先观摩一下 以下几个例子。通过观察,我们可以发现:
我们都知道两个相同位数的数,对其进行大小比较时,是从最高位开始比的,当在某位遇到不同值时,
哪个数该位的值大,则该数就大。比如12axx与12bxx,当a>b时,数12axx>12bxx.
对于此题,我们从左到右进行遍历,对第一位进行保留,此后每后移一位都先保留该位,然后判别此位之前的数位,是否比当前数位大,若大则丢弃,否则保留。在遍历的同时,对k进行操作,每丢弃一位,k的值就减小1。当k等于0时,即可结束遍历。若字符串遍历结束,k的值还未减小为0,则说明当前字符串已呈递增序列。此时仅保留前len(num)-k位即可。

注意:在最后输出结果时应去除最左侧的0,若去除后字符串为空,则返回0
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解答:


class Solution(object):
    def removeKdigits(self, num, k):
        stack = []
        remain = len(num) - k
        for digit in num:
            while k and stack and stack[-1] > digit:
                stack.pop()
                k -= 1
            stack.append(digit)
        return ''.join(stack[:remain]).lstrip('0') or '0'
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值