首页 > 其他分享 >402. 移掉k位数字

402. 移掉k位数字

时间:2023-10-08 11:36:07浏览次数:29  
标签:弹栈 数字 res 元素 single num 402 移掉 stack

链接

https://leetcode.cn/problems/remove-k-digits/description/

思路

这个题目要求移除k位后,剩下的数字最小。既然剩下的数字最小,那就牵扯到了类似于“字典序”这样一个概念。这样的题目是适合用单调栈来进行解决的。

依然是单调栈的三板斧:

1. 什么情况下我们弹栈。

2. 栈内元素是(部分)升序还是(部分)降序

3. 我们应该从前往后遍历,还是从后往前遍历

首先回答第二个问题,栈内元素应当是升序的,因为我们要求移除之后剩下的数字最小。

然后回答第三个问题,我们应该从前往后遍历。因为在一串数字中,左侧的比较大的数字对最后结果的影响最大,所以应该先处理左边。

最后回答第一个问题,我们应该遇到栈顶元素大于待入栈元素时弹栈,以保证单调栈中的元素是升序的。但这里有个k的限制,所以,当我们的k用完之前,我们可以弹栈,用完之后就不可以弹栈了。同时,如果栈顶元素是0时,我们不可以弹栈。因为0是前导0,我们在生成单调栈的过程中不需要处理。

在得到稳定的栈之后,我们还要判断k有没有用完,分别进行处理。

所以我们可以得到代码一。

但代码一并不够优雅。

第一点,我们既然要去掉k个字符,那我们就必然最多剩余remains = len(s)-k个字符。(这个是带着前导0的),这样我们就不需要在最后还去判断k的状态了。

第二点,我们在while循环中不用对0进行处理,为什么呢,因为栈顶元素大于待入栈元素,隐含了栈顶元素如果为0时不可能命中这个条件。

根据这两点可以得出代码二。

代码一

class Solution:
    def removeKdigits(self, num: str, k: int) -> str:
        single_stack = []
        for i in num:
            # k有额度时才能弹栈
            # 注意,这里用的是隐含ord比较,不需要转换成int,即可大大减少耗时
            while k > 0 and single_stack and single_stack[-1] > i:
                # val不是0的话, 就对k进行处理
                val = single_stack[-1]
                if val != '0':
                    k -= 1
                    single_stack.pop()
            single_stack.append(i)
        res = ''.join(single_stack).lstrip('0')
        # k超限了, 证明需要返回0
        if k >= len(res):
            return '0'
        # k没超限制, 对res进行截尾
        elif k > 0:
            return res[:-k]
        return res

 

代码二

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'

 

标签:弹栈,数字,res,元素,single,num,402,移掉,stack
From: https://www.cnblogs.com/bjfu-vth/p/17748473.html

相关文章

  • 2023-2024-1 20231402 《计算机基础与程序设计》第2周学习总结
    2023-2024-120231402《计算机基础与程序设计》第2周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2022-2023-1计算机基础与程序设计第2周作业这个作业的目标学习两本书的第一章,学习gcc,gdb作业正文https://www.......
  • 08_三个数字排序
    三个数字排序!/bin/bashread-p"请输入一个整数:"num1read-p"请输入一个整数:"num2read-p"请输入一个整数:"num3#不管谁大谁小,最后都打印echo"$num1,$num2,$num3"#num1中永远存最小的值,num2中永远存中间值,num3永远存最大值tmp=0if[$num1-gt$num2];t......
  • LeetCode 13 罗马数字转整数
    LeetCode13罗马数字转整数1.题目地址https://leetcode.cn/problems/roman-to-integer/description/2.题解这道题的解题过程非常简单,具体如下:1.我们需要将罗马数字对应的数,存到一个哈希表中。待用到时,直接使用即可。2.对于正常情况讲(前面......
  • 数字时代 低代码赋能新零售系统
    数字化时代,品牌、消费者、平台正融合成为一个不可分割的整体,既相互依存,又各自博弈。在这种生态下,新兴渠道陆续崛起、营销平台策略不断革新,越来越多的零售品牌开始探索全新的数字化运营模式。毋庸置疑,数字化已成为零售行业加速“狂飙”的新引擎之一,不仅可以帮助品牌触达消费者内心......
  • 数字时代 低代码赋能新零售系统
    数字化时代,品牌、消费者、平台正融合成为一个不可分割的整体,既相互依存,又各自博弈。在这种生态下,新兴渠道陆续崛起、营销平台策略不断革新,越来越多的零售品牌开始探索全新的数字化运营模式。毋庸置疑,数字化已成为零售行业加速“狂飙”的新引擎之一,不仅可以帮助品牌触达消费者内心,实......
  • 科创人·TATA木门CIO乐勇斌:数字化变革大坎儿在组织变革,天再冷也要拥抱智能
    乐勇斌TATA木门信息中心总监10年+信息化领域管理咨询经验,熟悉零售、电商、汽车、医药、制造、机械加工、家居制造等行业信息化规划、解决方案、建设和流程落地;具备跨区域、项目集和项目组合管控能力,擅于集团化产供销一体化规划,以及跨业务领域的IT整合、中台化架构及流程管理建......
  • 在安全数字包裹机制下,汽车制造业如何安全可控地实现上下游协作?
    随着互联网的发展,现在越来越多的企业通过传递电子文件的形式实现网上办公,提高便捷性的同时,也带了文件泄露的风险。尤其是一些机密文档,万一不小心外泄出去,对企业的造成的影响将是不可估量的。2023年1月,小米官方发布“小米汽车保险杠设计图外泄”事件的处理结果,小米二级供应商北京......
  • 以视频监控系统 EasyCVR 为例带您详解数字视频监控
    安防视频监控平台EasyCVR是一个具有强大拓展性、灵活的视频能力和轻便部署的平台。它支持多种主流标准协议,包括国标GB28181、RTSP/Onvif、RTMP等,还可以支持厂家的私有协议和SDK接入,例如海康Ehome、海大宇等设备的SDK。该平台不仅拥有传统安防视频监控的功能,还具备接入AI智能分析的......
  • 力扣-2535-数组元素和与数字和的绝对差
    给你一个正整数数组nums。元素和是nums中的所有元素相加求和。数字和是nums中每一个元素的每一数位(重复数位需多次求和)相加求和。返回元素和与数字和的绝对差。注意:两个整数x和y的绝对差定义为|x-y|。 示例1:输入:nums=[1,15,6,3]输出:9解释:nums的元素......
  • Java生成6位随机数(数字和拼音)Demo
    publicstaticvoidmain(String[]args){//length=6生成的位数intlength=6;StringBuffersb=newStringBuffer();StringALLCHAR="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";Randomrandom=newRandom();f......