去除k位数字,使剩下的数字最小(字典序最小)。做题多了还是有好处的,这和昨天的分块问题是一样的,都可以用单调栈解决。如果后面有比前面小的,那前面的就应该删去。还有要注意的就是栈为空时不能push0进栈,此处用字符串模拟栈,各种操作都是O(1)的。用list也可,但会麻烦些。
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
stack = ""
for idx, c in enumerate(num):
if k == 0:
stack += num[idx:]
break
while stack and c < stack[-1] and k > 0:
stack = stack[:-1]
k -= 1
if stack or c != '0': stack += c
if k > 0: stack = stack[:-k]
if stack: return stack
return '0'