class Solution: def removeKdigits(self, num: str, k: int) -> str: stack = [] for item in num: while stack and stack[-1]>item and k>0: k-=1 stack.pop(-1) stack.append(item) for i in range(k): stack.pop(-1) return "".join(stack).lstrip('0') or '0'
代码上早了- -。
这题的意义学到了什么呢,首先这种题要先摸清规律,这题的规律就是:你要想数字最小,如果你是个递增序列,那就去除最后面的。如果是递减的序列,就要去除最前面的。所以你每次都要找到相连的a和b两个位置有a>b,这时候a就是你想要扔掉的数字。
stack在这里就是单调栈了,用来保存一个递增的序列,一旦出现了a>b,b这个数就要被扔掉了,否则b会被加入到单调栈中,这样栈中保存的结果就是前面子序列的最优解了。
一轮遍历之后stack里面已经是要给递增的序列了,这时候如果我们的k还没有为0还需要继续删除,那么就直接从后面删除k个就可以了。
这道题最经典的我感觉是最后 ,"".join(stack).lstrip('0') or '0' 这里如果前面有前置0就通过lstrip来删除掉了,如果前面都是0那么字段是个空字段,这时候就返回'0‘。非常经典