LeetCode移掉k位数字(贪心算法)python

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

num的长度小于10002,且将≥k。给定的num不包含任何前导零。

您在真实的面试中是否遇到过这个题?
样例
Example 1:

Input: num = “1432219”, k = 3
Output: “1219”

Example 2:

Input: num = “10200”, k = 1
Output: “200”
说明:去掉4、3、2三个数字,形成最小的新数字1219。
Example 3:

Input: num = “10”, k = 2
Output: “0”
num的长度小于k

思路:
官方思路:

给定一个数字序列如526 ,如果要求我们只删除一个数字,那么从左到右,我们有5,2,6三个选择,我们将每一个数字和它的左边进行比较,从2开始,小于它的左边5,我们应删除5。
这个定义我们的贪心规则,每个数字都如此。直到满足一些条件 结束:如 保存的数字为空,或者已经删除啦k位数字。

注意一些特殊情况:
(1)单调递增数据,贪心规则不好使,直接删除数据最后k位,然后返回。
(2)k==0,返回原数据。
(3)在贪心规则里删除的数字小于k位,如删除了A位,我们需要在贪心外删除原始数据最后的k-A 位。
代码:

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        numStack = []

        # 构造一个单调递增的数字序列
        for digit in num:
            while k and numStack and numStack[-1] > digit:
                numStack.pop()
                k -= 1

            numStack.append(digit)

        # 递增情况  将最后剩下的K位Trunk:返回整个列表
        #在while 循环里删除数字小于k位 如m位,将while后面得到的数据 直接删除最后k-m位,注意此时代码里的k=k-m。因为已经在while k减去了m
        #在K ==0的情况下 返回原始数据numStack
        finalStack = numStack[:-k] if k else numStack

        # 把前导零串起来
        return "".join(finalStack).lstrip('0') or "0"
C=Solution()
d=C.removeKdigits("1432219",k=3)
print(d)

结果:1219

猜你喜欢

转载自blog.csdn.net/kobeyu652453/article/details/106842330