移掉k位数字

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'

  

代码上早了- -。

 

移掉k位数字

 

   这题的意义学到了什么呢,首先这种题要先摸清规律,这题的规律就是:你要想数字最小,如果你是个递增序列,那就去除最后面的。如果是递减的序列,就要去除最前面的。所以你每次都要找到相连的a和b两个位置有a>b,这时候a就是你想要扔掉的数字。

  stack在这里就是单调栈了,用来保存一个递增的序列,一旦出现了a>b,b这个数就要被扔掉了,否则b会被加入到单调栈中,这样栈中保存的结果就是前面子序列的最优解了。

  一轮遍历之后stack里面已经是要给递增的序列了,这时候如果我们的k还没有为0还需要继续删除,那么就直接从后面删除k个就可以了。

  这道题最经典的我感觉是最后 ,"".join(stack).lstrip('0') or '0' 这里如果前面有前置0就通过lstrip来删除掉了,如果前面都是0那么字段是个空字段,这时候就返回'0‘。非常经典

上一篇:阿里云峰会·上海·开发者大会开源大数据前沿趋势与最佳实践即将重磅来袭,快速报名通道已开启


下一篇:delphi中的Case使用方法及DIV及MOD千分位、百分位、十位的截取