leetcode练习题(5)

402. Remove K Digits

description:

Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.

Example 1:

Input: num = “1432219”, k = 3
Output: “1219”
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.

Example 2:

Input: num = “10200”, k = 1
Output: “200”
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.

解题思路:

  • 贪心算法。拿到这题的第一反应就是从头开始遍历,若找到某一位比它后一位要大,那自然可以删除它,然后把后一位提上来,再重新开始遍历。
  • 这里其实犯了一个很愚蠢的错误,如果每次删除后重新遍历的话,其实做了很多无用功,我就想着添加一个标志位,但如果遇到有多个相同的数字连续出现的话,其实不好判断,这样太麻烦。
  • AC之后参考了一下讨论区的代码,发现用栈辅助十分的方便,只需要每次跟栈顶的比较,若比较失败直接入栈。
Mysolution:
#第一次写的奇慢的解
class Solution:
    def removeKdigits(self, num, k):
        i = 0
        if k >= len(num):
            return '0'
        while k > 0 and len(num):
            if num[i] > num[i + 1]:
                num = num[0:i] + num[i + 1:]
                i = 0
                k -= 1
            else:
                if i == len(num) - 2:
                    s = len(num)
                    num = num[0: s - k]
                    k = 0
                else:
                    i += 1
        if num[0] == '0' and len(num) > 1:
            num = num.lstrip('0')
        if not num:
            return '0'
        return num
#改进之后的
class Solution:
    def removeKdigits(self, num, k):
        result = []
        for digit in num:
            while k and result and digit < result[-1]:
                result.pop()
                k -= 1
            result.append(digit)
        result = ''.join(result).lstrip('0')
        if k:
            result = result[:-k]
        if not result:
            return '0'
        else: 
            return result
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值