题目:
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
思路:
为了让大家对该题有个清晰的认识,可以先观摩一下 以下几个例子。通过观察,我们可以发现:
我们都知道两个相同位数的数,对其进行大小比较时,是从最高位开始比的,当在某位遇到不同值时,
哪个数该位的值大,则该数就大。比如12axx与12bxx,当a>b时,数12axx>12bxx.
对于此题,我们从左到右进行遍历,对第一位进行保留,此后每后移一位都先保留该位,然后判别此位之前的数位,是否比当前数位大,若大则丢弃,否则保留。在遍历的同时,对k进行操作,每丢弃一位,k的值就减小1。当k等于0时,即可结束遍历。若字符串遍历结束,k的值还未减小为0,则说明当前字符串已呈递增序列。此时仅保留前len(num)-k位即可。
注意:在最后输出结果时应去除最左侧的0,若去除后字符串为空,则返回0
解答:
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[:remain]).lstrip('0') or '0'