# 402. Remove K Digits ## Description Given string num representing a non-negative integer num, and an integer k, return the smallest possible integer after removing k digits from num. ### Example Example 1: >Input: num = "1432219", k = 3 Output: "1219" Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest. Example 2: >Input: num = "10200", k = 1 Output: "200" Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes. Example 3: >Input: num = "10", k = 2 Output: "0" Explanation: Remove all the digits from the number and it is left with nothing which is 0. ### Constraints: `1 <= k <= num.length <= 105` `num consists of only digits.` `num does not have any leading zeros except for the zero itself.` ## 解題 好難,被擊敗了,參考 [youtube教學](https://www.youtube.com/watch?v=cFabMOnJaq0&ab_channel=NeetCode) 使用 monotonic stack 的技巧。因為在高位的數會主導整個數的大小,所以會希望數列盡量由小到大排列,所以我們希望維護一個 ascending monotonic stack,由於它會限制你只能刪掉 k 個元素,所以在 stack 中 pop 掉 k 個元素便停止。 ### Python ```python class Solution: def removeKdigits(self, num: str, k: int) -> str: if k >= len(num): return "0" stack = [] for c in num: while k > 0 and stack and stack[-1] > c: stack.pop() k -= 1 stack.append(c) stack = stack[:len(stack) - k] ret = ''.join(stack) return str(int(ret)) ``` 目前過不了,卡在測試項目中 int 與 str 之間的轉換超過他的最大值。 ```python class Solution: def removeKdigits(self, num: str, k: int) -> str: stack = [] for digit in num: while stack and k > 0 and stack[-1] > digit: stack.pop() k -= 1 stack.append(digit) # If k > 0, remove remaining k digits from the end of the stack # 有可能遍歷num後k還沒用完,也就是說後面的digits都比前面的大,沒有觸發置換 stack = stack[:-k] if k > 0 else stack # Remove leading zeros result = ''.join(stack).lstrip('0') # Handle edge case where result might be empty return result if result else '0' ```