402. Remove K Digits
description:
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.
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.
解题思路:
- 贪心算法。拿到这题的第一反应就是从头开始遍历,若找到某一位比它后一位要大,那自然可以删除它,然后把后一位提上来,再重新开始遍历。
- 这里其实犯了一个很愚蠢的错误,如果每次删除后重新遍历的话,其实做了很多无用功,我就想着添加一个标志位,但如果遇到有多个相同的数字连续出现的话,其实不好判断,这样太麻烦。
- AC之后参考了一下讨论区的代码,发现用栈辅助十分的方便,只需要每次跟栈顶的比较,若比较失败直接入栈。
Mysolution:
#第一次写的奇慢的解
class Solution:
def removeKdigits(self, num, k):
i = 0
if k >= len(num):
return '0'
while k > 0 and len(num):
if num[i] > num[i + 1]:
num = num[0:i] + num[i + 1:]
i = 0
k -= 1
else:
if i == len(num) - 2:
s = len(num)
num = num[0: s - k]
k = 0
else:
i += 1
if num[0] == '0' and len(num) > 1:
num = num.lstrip('0')
if not num:
return '0'
return num
#改进之后的
class Solution:
def removeKdigits(self, num, k):
result = []
for digit in num:
while k and result and digit < result[-1]:
result.pop()
k -= 1
result.append(digit)
result = ''.join(result).lstrip('0')
if k:
result = result[:-k]
if not result:
return '0'
else:
return result