LeetCode题练习与总结:移掉 K 位数字--402

一、题目描述

给你一个以字符串表示的非负整数 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 <= 10^5
  • num 仅由若干位数字(0 - 9)组成
  • 除了 0 本身之外,num 不含任何前导零

二、解题思路

这个问题可以通过贪心算法和栈来解决。我们希望剩下的数字尽可能小,因此我们应该从左到右扫描数字,并且尽可能地保留较小的数字。具体步骤如下:

  1. 使用一个栈来保存最终的数字。
  2. 遍历输入的字符串数字。
  3. 对于当前数字,如果它小于栈顶元素,并且我们可以移除更多的数字(即 k > 0),那么我们就移除栈顶元素。这样可以保证栈中的数字始终是递增的,从而保证最后得到的数字是最小的。
  4. 如果当前数字大于或等于栈顶元素,或者 k 为 0,则将当前数字压入栈中。
  5. 遍历完成后,如果 k 仍然大于 0,则从栈顶移除额外的 k 个数字。
  6. 将栈中的数字转换为字符串,并去除前导零。
  7. 如果栈为空,则返回 “0”。

三、具体代码

import java.util.Stack;class Solution {public String removeKdigits(String num, int k) {Stack<Character> stack = new Stack<>();for (char c : num.toCharArray()) {// 当栈不为空,k大于0,并且栈顶元素大于当前元素时,弹出栈顶元素while (!stack.isEmpty() && k > 0 && stack.peek() > c) {stack.pop();k--;}// 当前字符不为'0'或者栈不为空时,将当前字符入栈if (c != '0' || !stack.isEmpty()) {stack.push(c);}}// 如果k还大于0,继续弹出栈顶元素while (!stack.isEmpty() && k > 0) {stack.pop();k--;}// 如果栈为空,返回"0"if (stack.isEmpty()) {return "0";}// 构建结果字符串StringBuilder sb = new StringBuilder();while (!stack.isEmpty()) {sb.append(stack.pop());}// 由于栈是逆序的,需要反转字符串return sb.reverse().toString();}
}

这段代码首先使用一个栈来维护一个递增的数字序列,然后通过遍历输入字符串,并按照贪心策略进行操作,最后将栈中的元素转换成字符串,并返回结果。注意,在构建结果字符串时,需要反转字符串,因为栈中保存的数字是逆序的。同时,在处理过程中,我们还要注意去除前导零。

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 遍历字符串 num 中的每个字符,需要 O(n) 的时间,其中 n 是字符串 num 的长度。
  • 在每次遍历中,可能会进入一个循环,该循环会将栈顶元素弹出,直到不再满足条件。在最坏的情况下,这个循环可能执行 k 次。由于每次循环中都会减少 k 的值,因此这个循环总共最多执行 n 次(每个元素最多被弹出一次)。所以,这个循环对总时间复杂度的贡献是 O(n)。
  • 最后,将栈中的元素转移到 StringBuilder 中,并反转字符串,这需要 O(n) 的时间。

综上所述,总的时间复杂度是 O(n) + O(n) + O(n) = O(n),其中 n 是字符串 num 的长度。

2. 空间复杂度
  • 使用了一个栈来存储数字,在最坏的情况下,如果 k 为 0,即不需要移除任何数字,那么栈中会存储所有的 n 个字符。因此,栈的空间复杂度是 O(n)。
  • 使用了一个 StringBuilder 来构建最终的结果字符串,在最坏的情况下,它也会存储 n 个字符。因此,StringBuilder 的空间复杂度是 O(n)。

由于这两个数据结构是独立使用的,它们的空间复杂度是叠加的,因此总的空间复杂度是 O(n) + O(n) = O(n),其中 n 是字符串 num 的长度。

五、总结知识点

  • 数据结构 - 栈(Stack)

    • 栈是一种后进先出(LIFO)的数据结构,用于解决特定类型的问题,如括号匹配、逆序输出、函数调用等。
    • 在这段代码中,栈用于维护一个递增的数字序列,从而帮助找到最小的数字。
  • 贪心算法

    • 贪心算法是一种在每一步选择中都采取当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法。
    • 在这个问题中,通过比较当前字符与栈顶字符,如果当前字符更小并且允许移除数字(k > 0),则移除栈顶字符,以保持剩余数字尽可能小。
  • 字符串处理

    • 使用 toCharArray() 方法将字符串转换为字符数组,以便于遍历。
    • 使用 StringBuilder 类来构建最终的字符串结果,这是因为 StringBuilder 在频繁修改字符串时比 String 更高效。
  • 循环和条件判断

    • 使用 for 循环来遍历字符串中的每个字符。
    • 使用 while 循环来处理栈操作,直到满足特定条件为止。
    • 使用 if 语句和逻辑运算符来检查条件,如栈是否为空、k 是否大于 0 以及栈顶元素是否大于当前字符。
  • 边界条件处理

    • 在将字符压入栈之前,检查字符是否为 ‘0’,以避免结果字符串中出现前导零。
    • 在处理完所有字符后,如果 k 仍然大于 0,则继续从栈中移除元素,直到 k 为 0。
    • 如果栈为空,则返回 “0”,这是处理特殊情况的一种方式,例如输入字符串全是 ‘0’ 或 k 等于字符串长度。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/18168.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在几分钟内将数据从 Oracle 迁移到 ClickHouse

ClickHouse 是一个开源的面向列的数据库管理系统。它在实时数据处理方面的出色性能显着增强了数据分析和业务洞察力。将数据从 Oracle 迁移到 ClickHouse 可以释放数据在决策中的力量&#xff0c;这是单独使用 Oracle 无法实现的。 本教程介绍如何使用 BladePipe 将数据从 Orac…

Linux网络:HTTPS协议

Linux网络&#xff1a;HTTPS协议 加密方式对称加密非对称加密混合加密中间人攻击 证书数据签名CA认证 HTTPSSSL/TSLHTTPS 在HTTP协议中&#xff0c;所有的数据都采用明文的形式传输&#xff0c;这就会导致数据非常容易泄露&#xff0c;只要拿到HTTP报文&#xff0c;就可以窃取各…

(计算机毕设)基于springboot免税商品购物商城的设计与实现

博主可接毕设设计&#xff01;&#xff01;&#xff01; 各种毕业设计源码只要是你有的题目我这里都有源码 基于springboot免税商品购物商城的设计与实现 摘 要 Abstract 第一章 绪论 1.1 课题开发的背景 1.2 课题研究的意义 1.3 研究内容 第二章 系统开发关键技术…

计算机能力挑战赛c语言2024

先看看答题页面长啥样&#xff1a;选择题15道&#xff0c;编程题4道 选择题&#xff08;楼主个人答案&#xff09; 编程题

Java集合HashMap——针对实习面试

目录 Java集合MapHashMap的特性是什么&#xff1f;HashMap和Hashtable的区别&#xff1f;HashMap和HashSet的区别&#xff1f;HashMap和TreeMap的区别&#xff1f;说说HashMap的底层实现什么是hash冲突&#xff1f;有什么办法减少hash冲突&#xff1f;为什么HashMap的容量总是2…

数据结构:图(二)---- 最小生成树算法

接着上回的分享&#xff0c;继续分享一下图中比较重要的一类应用 那就是求最小生成树 最小生成树的定义 连通图中的每一棵生成树&#xff0c;都是原图的一个极大无环子图&#xff0c;即&#xff1a;从其中删去任何一条边&#xff0c;生成树 就不在连通&#xff1b;反之&#xf…

编程语言的前后端分离:可用JavaScript运行时作为后端的语言及与传统编程语言的对比 -Typescript、Nim、Moonbit

在现代软件开发中&#xff0c;编程语言的**“前后端分离”**概念鲜有提及&#xff0c;却是语言设计与实现的重要基石。这里的“前端”并非指 Web 开发中的界面部分&#xff0c;而是编程语言实现中的语法解析、词法分析等部分&#xff1b;“后端”则指生成可执行代码或中间代码的…

【蓝牙协议栈】【BLE】【BAS】精讲蓝牙电池服务

1. 蓝牙电池服务(Bluetooth Battery Service)概念 蓝牙电池服务是蓝牙设备与其他设备通信时用于报告其剩余电池电量的标准服务。它让用户能够随时了解蓝牙设备(如无线耳机、智能手表、蓝牙鼠标/键盘等)的电池状态,从而方便地管理这些设备的续航与电源使用。 BAS通常用于在…

dnaMethyAge包学习笔记

1.introduction 许多对甲基化年龄进行计算的文章都是采用网站实现计算的&#xff0c;能够实现对甲基化年龄的计算的R包相对比较少&#xff0c;其中应用最广的是dnaMethyAge包。作者本想寻找能够计算Grimage和Grimage2的R包&#xff0c;奈何没有寻找到&#xff0c;因此只能记录一…

详解八大排序(四)------(归并排序)

文章目录 前言&#xff1a;1 递归版本&#xff08;MergeSort&#xff09;1.1 核心思路1.2 实现代码 2 非递归版本&#xff08;MergeSortNonR&#xff09;2.1 核心思路2.2 实现代码 3.完整代码 前言&#xff1a; 归并排序的核心思路是把数组里面的数两两分成一组&#xff0c;组内…

商城小程序的流程渠道拓展

传统印象里&#xff0c;小程序的开发制作似乎很难&#xff0c;尤其是商城类型且功能体系完善的&#xff0c;事实也确实如此&#xff0c;没有较高的技术和成本投入或团队各个流程的专业人员合作&#xff0c;很难开发出来成品&#xff0c;或者质量较低。 当然对于大公司来说&…

小程序-基于java+SpringBoot+Vue的超市购物系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

Android开发-Pokémon界面设计

实现效果图&#xff0c;还没更新完 二、功能说明&#xff1a; 在上次实验的基础之上把recycleviewb列表完善并且增加点击效果&#xff0c;点击之后可以跳转到另外一个activity上&#xff0c;并且添加返回按钮&#xff0c;可以放回原列表页面&#xff0c;列表中的每一行都对应的…

jenkins的安装(War包安装)

‌Jenkins是一个开源的持续集成工具&#xff0c;基于Java开发&#xff0c;主要用于监控持续的软件版本发布和测试项目。‌ 它提供了一个开放易用的平台&#xff0c;使软件项目能够实现持续集成。Jenkins的功能包括持续的软件版本发布和测试项目&#xff0c;以及监控外部调用执行…

HopToDesk 安全加密、免费开源,远程桌面新选择!

远程桌面工具越来越成为现代工作生活的刚需。你是否还在为寻找一个既安全又免费的工具而苦恼&#xff1f;HopToDesk&#xff0c;一款支持安全加密、免费开源的远程桌面软件&#xff0c;或许正是你的不二之 HopToDesk与传统的远程桌面工具相比有哪些独特优势&#xff1f;它如何…

yum工具的学习

Linux下安装软件的方法 1.源代码安装 2.rmp包安装 3.包管理器进行安装 --- yum/apt Linux下载软件的过程 操作系统的好坏评估 -- 生态问题 yum具体操作 Linux软件安装所有人都能用&#xff0c;是以other的身份去执行可执行程序 文件拷贝&#xff08;sudo&#xff09;-- &g…

react 如何修改弹出的modal的标题

原来标题的样子&#xff1a; 修改为&#xff1a; 实现方式&#xff1a; <Modal title<span>股价趋势/{this.state.pccode}</span> visible{this.state.isPriceModalOpen} style{{ top: 20 }} width{1320} height{400} footer{null} onCancel{()>this.hideMo…

计算机网络-理论部分(一):概览

重点 计算机网络的重点是协议&#xff0c;各种协议&#xff0c;每种协议都有自己对应的应用场景以及对应功能&#xff0c;学好协议&#xff0c;就学好了计算机努网络。 协议分层 协议分层围绕数据的传递展开。数据的传递需要包括&#xff1a;打包数据&#xff0c;控制传递&a…

开源科学工程技术软件介绍 – EDA工具KLayout

link 今天向各位知友介绍的 KLayout是一款由德国团队开发的开源EDA工具。 KLayout是使用C开发的&#xff0c;用户界面基于Qt。它支持Windows、MacOS和Linux操作系统。安装程序可以从下面的网址下载&#xff1a; https://www.klayout.de/build.html KLayout图形用户界面&…

SpringMVC的视图

目录 一.视图分类 &#xff08;1&#xff09;转发视图&#xff08;Forward View&#xff09;&#xff1a; &#xff08;2&#xff09;重定向视图&#xff08;Redirect View&#xff09;&#xff1a; &#xff08;3&#xff09;其他视图技术 二.转发视图 三.重定向视图 四…