描述
给定一个以字符串表示的非负整数 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