题目描述
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
示例 1 :
输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
示例 2 :
输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
示例 3 :
输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是0。
解题思路
看到这道题,感觉到无从下手,首先想到的就是枚举所有可能,然后找出最小的,可想而知肯定会超时。做这种题必须得靠技巧,看了别人大佬得解法后才觉得妙,具体的可以看这篇描述https://leetcode-cn.com/problems/create-maximum-number/solution/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-7/,使用一个栈,首先第一个数字进栈,然后后面元素进栈时判断和栈顶元素的大小,如果当前栈顶元素比新进栈元素大,就弹出。
class Solution(object): def removeKdigits(self, num, k): stack = [] remain = len(num) - k for digit in num: while k and stack and stack[-1] > digit: stack.pop() k -= 1 stack.append(digit) return "".join(stack[0: remain]).lstrip('0') S = Solution() print(S.removeKdigits("10200", 1))