码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 华为校招第三题 找最小数


    给你一个以字符串表示的非负整数 num 和一个整数 k ,移除这个数中的 k 位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。

    示例 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 。
    • 1 <= k <= num.length <= 105
    • num 仅由若干位数字(0 - 9)组成
    • 除了 0 本身之外,num 不含任何前导零

    单调栈 

    比较a和b的大小,是从最高位开始进行比较的。 那么,我们也应该是从最高位开始进行删数。所以,就是对num进行单调上升栈的维护。 逐个数字入栈,当发现当前入栈元素<栈顶元素s.top()的时候,就s.pop(),维护栈的单调递增性。 这样就可以保证,结果的最高位最小,并以此递增。

    当所有元素都进行过栈的处理之后,如果结果stack中的元素比要保留的长度要长的话,则把栈顶元素pop掉。
    在入栈的时候,可忽略掉前置0.

    1. string removeKdigits(string num, int k) {
    2. stack<char> s;
    3. for (char i : num)
    4. {
    5. while (!s.empty() && s.top() > i && k)
    6. {
    7. s.pop();
    8. k--;
    9. }
    10. if (s.empty() && i == '0')
    11. continue;//跳过前置0
    12. s.push(i);
    13. }
    14. string res;
    15. while (!s.empty())
    16. {
    17. if (k > 0)//当还要再移除数字的时候:从此时单调递增栈的top部删去数字
    18. k--;
    19. else if (k == 0)//当不用再移除数字的时候:把字符串取出来到result
    20. res += s.top();
    21. s.pop();
    22. }
    23. reverse(res.begin(), res.end());//stl中的reverse函数
    24. return res == "" ? "0" : res;
    25. }

    用string实现的单调栈

    不用初始化一个栈,而是直接用string来实现栈的功能:维护单调上升的序列。

    1. class Solution {
    2. public:
    3. string removeKdigits(string num, int k)
    4. {
    5. string result;
    6. for (int i = 0; i < num.size(); i++)
    7. {
    8. while (result.size() && k&&result.back() > num[i])
    9. {
    10. result.pop_back();
    11. k--;
    12. }
    13. if (result.size() == 0 && num[i] == '0')
    14. continue;
    15. result+=num[i];
    16. }
    17. while (k > 0 && !result.empty())
    18. {
    19. result.pop_back();
    20. k--;
    21. }
    22. return result == "" ? "0" : result;
    23. }
    24. };

  • 相关阅读:
    (六)RabbitMQ第二种模型:工作模型(Work Queues)
    clion 中的undefined reference to 问题解决
    数据挖掘实战应用案例精讲-【概念篇】数据湖(补充篇)(Data Lake )
    React 为什么使用map来渲染列表 而不是其他循环方法
    计算机毕业设计Java哈尔滨旅游项目推荐平台演示录像2020(源码+系统+mysql数据库+Lw文档)
    Netty Review - 从BIO到NIO的进化推演
    【深入理解设计模式】外观设计模式
    游戏开发者如何能达到5万月薪?这太难了......
    【总结】坐标变换和过渡矩阵(易忘记)
    Spring Security基本框架之用户定义
  • 原文地址:https://blog.csdn.net/zhendong825/article/details/134068136
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号