题目
给定一个以字符串表示的非负整数 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。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/remove-k-digits
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
count相当于头指针,表示要保留的数字,k是需要删除的数字个数为k,选取从count到count+k+1个数字,求最小值,删除最小值前所有数字,更新k。循环执行直到k=0或者count+k+1到达队列尾部。
如果count+k+1指向队列尾部还没有舍弃完毕,就从队列尾部弹出k个数字
遇到的问题
感觉写出了c风格的代码,思路没有转过来,一堆if看着恶心
代码
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
count = 0
if len(num) == k:
return '0'
temp = []
for i in num:
temp.append(int(i))
while (k):
if(count+k<len(temp)):
minnum = min(temp[count:count + k + 1])
for i in temp[count:count + k + 1]:
if i != minnum:
temp.remove(i)
k = k - 1
if not k:
break
else:
count=count+1
break
else:
for i in range(k):
temp.pop()
k=0
strnum = ''
for i in temp:
if i != 0 or strnum != '':
strnum = strnum + str(i)
if strnum == '':
strnum = '0'
return strnum
结果
执行用时 :
248 ms, 在所有 python3 提交中击败了24.66%的用户
内存消耗 :
14 MB, 在所有 python3 提交中击败了5.71%的用户
结论
可以欣赏别人用单调栈来做