402. 移掉 K 位数字

402. 移掉 K 位数字

给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

题解

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
    	# 剪枝
        if len(num) == k:
            return '0'
        # 单调栈  从左到右入栈
        stack = []
        for i in num:
            if k == 0:
                stack.append(i)
                continue
            if len(stack) == 0:
                stack.append(i)
            else:
                while len(stack) > 0 and i < stack[-1] and k > 0:
                    if i < stack[-1]:
                        stack.pop()
                        k -= 1
                else:
                    stack.append(i)
        # 要删除的数量为满足,因为栈是单调递增的,所以大的元素在后面,从栈顶删就好了
        while k > 0:
            stack.pop()
            k -= 1
        # 去除前导“0”的影响
        start = 0
        for i in stack:
            if i == '0':
                start += 1
            else:
                break
        # 组合答案
        res = ''.join(stack[start:])
        if len(res) == 0:
            res = '0'
        return res

思路

贪心的策略,如果大的数在高位则删除。使用单调栈保证栈中后入的元素始终是大于等于先入的元素,在完成所有数字的入栈操作后,删除的元素个数还是小于k,则将低位上的较大的数字删除,以此保证剩余数字组成的数最小。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值