402. 移掉K位数字
原始题目链接:https://leetcode-cn.com/problems/remove-k-digits/
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
注意:
num 的长度小于 10002 且 ≥ k。
num 不会包含任何前导零。
解题思路:
移掉k位数字,就是最后保留len(num) - k位数字,从左到右遍历数字字符串num,每次筛选的时候需要比较数字的大小,并且开始比较的位置是与当前位置左侧相邻的字符,即从右到左,所以适合使用栈这个数据结构来获取之前入栈的字符,stack[-1]就是最后入栈的字符,即相邻的字符。具体实现看代码及注释。
代码实现:
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
# 存储筛选后的数字字符
stack = []
n = len(num)
# 用于记录返回最后结果的结束索引,即最后就剩下n-k个数字
remain_index = n - k
# 遍历num
for digit in num:
# k还大于0,并且栈中有数字,并且栈中的数字大于后面遍历的数字
# 这样数字筛选掉,即出栈
while k and stack and stack[-1] > digit:
stack.pop()
k -= 1
# 数字入栈
stack.append(digit)
# 去掉首位是0的情况或者不满足条件的话直接返回“0”
return "".join(stack[:remain_index]).lstrip('0') or "0"
参考文献:
https://leetcode-cn.com/problems/remove-duplicate-letters/solution/yi-zhao-chi-bian-li-kou-si-dao-ti-ma-ma-zai-ye-b-4/