Skip to content

402 Remove K Digits

单调栈很好的题目, 也有很多edge case需要处理. Edge case包括:

  • one pass后发现k>0, 说明stack中的元素是递增的, 需要从stack尾部删除k个元素
  • 最后的solution stack可能是[0,0,0,0,0], 需要去掉leading 0s. 去完leading 0s后如果为空, 返回"0". 这些0来源于每次遇到0的时候, 会把stack中的元素全部弹出.

Approach 1: Monotonically Increasing Stack

维护一个单调递增的栈,当遇到一个数字比栈顶元素小的时候(出现downhill),就把栈顶元素弹出,直到栈顶元素比当前数字小或者栈为空,然后把当前数字压入栈中。这样可以保证栈中的元素是单调递增的。

每次出栈都decrement k,直到k为0或者栈为空。最后,如果k还大于0,说明栈中的元素是递增的,需要从栈尾部删除k个元素, 因为这时候的stack是一个递增的序列,删后面的更划算。

Tip

k == 0后,后面的数字不管三七二十一,全都要.

最后,把栈中的元素拼接成字符串,去掉leading 0, 如果为空则返回"0"。

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        stack = []
        for digit in num:
            while stack and stack[-1] > digit and k > 0:
                stack.pop()
                k -= 1
            stack.append(digit)

        # remove last k digits if k > 0 (increasing digits)
        res = stack[:-k] if k else stack

        # remove all leading zeros
        final = "".join(res).lstrip('0')

        return final if final else "0"