题目描述
Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.
Note:
The length of num is less than 10002 and will be ≥ k.
The given num does not contain any leading zero.
例子
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.
解释
给一个数字,用字符串的形式表示,和一个整数k,我们可以从给定数字中删除k位数,求所有可能得到的数字中的最小数。
思路 贪心算法 + 栈
这道题我们用贪心算法做。遍历字符串,如果当前位比栈顶位小,则栈顶位弹出,直到当前位比栈顶位大时,入栈。当然同时我们还要维护一个数字k。弹出的操作在整个遍历过程中不能超过k次(即删除的位数不能超过k位)。如果遍历到最后k仍不为0,则将最后的k位直接删除。
代码
class Solution(object):
def removeKdigits(self, num, k):
"""
:type num: str
:type k: int
:rtype: str
"""
stack = []
for i in range(len(num)):
while k and stack and num[i] < stack[-1]:
stack.pop(-1)
k -= 1
stack.append(num[i])
#如果最后k仍不为0,多余的位直接删除
if k != 0:
stack = stack[:-k]
#删除最后字符串头部的0
if "".join(stack).lstrip('0'):
return "".join(stack).lstrip('0')
return '0'