力扣(leetcode)闲来无事刷一刷

力扣(leetcode)402. 移掉K位数字 python

题目

给定一个以字符串表示的非负整数 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%的用户

结论

可以欣赏别人用单调栈来做

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值