木又连续日更第15天(15/100)
木又的第176篇leetcode解题报告
贪心
类型第5篇解题报告
leetcode第62题:移掉K位数字
https://leetcode-cn.com/problems/remove-k-digits
【题目】
给定一个以字符串表示的非负整数 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。
【思路】
使用一个栈,栈底元素到栈顶元素从小到大,遍历字符串时,如果字符小于栈顶元素,则直接弹出栈顶元素。遍历结束后,如果删除元素的个数小于k,则继续删除足够数量的栈顶元素。
【代码】
python版本
class Solution(object):
def removeKdigits(self, num, k):
"""
:type num: str
:type k: int
:rtype: str
"""
if k >= len(num):
return '0'
stack = []
for i, n in enumerate(num):
if k == 0:
stack.append(num[i:])
break
if len(stack) == 0 or n >= stack[-1]:
stack.append(n)
else:
while len(stack) > 0 and n < stack[-1]:
stack.pop(-1)
k -= 1
if k == 0:
break
stack.append(num[i])
while k != 0:
stack.pop(-1)
k -= 1
res = ''.join(stack).lstrip('0')
if res == '':
res = '0'
return res