leetcode402. Remove K Digits
时间:2022-06-19
本文章向大家介绍leetcode402. Remove K Digits,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目要求
Given a non-negative integer num represented as a string, remove k digits from the number so that the new number is the smallest possible.
Note:
The length of num is less than 10002 and will be ≥ k.
The given num does not contain any leading zero.
Example 1:
Input: num = "1432219", k = 3
Output: "1219"
Explanation: Remove the three digits 4, 3, and 2 to form the new number 1219 which is the smallest.
Example 2:
Input: num = "10200", k = 1
Output: "200"
Explanation: Remove the leading 1 and the number is 200. Note that the output must not contain leading zeroes.
Example 3:
Input: num = "10", k = 2
Output: "0"
Explanation: Remove all the digits from the number and it is left with nothing which is 0.
假设现在有一个用字符串表示的非负的整数,问从中删除掉k个数字后能够得到的最小结果是多少?
思路和代码
直观的来说,删除数字得到最小的数字意味着我们应当尽可能的将越小的数字保留在高位,因此当我们从左往右遍历时,一旦遇到比前一个数字更小的数字,就应当删除前一个数字而保留这个数字。当我们用尽了所有删除时,就保留后面所有的数字,不再进行任何比较。因为我们已经尽可能获得了最小的最高位,因此无论后面的数字如何取值,其最高位上的数字一定是可以获得的最小的这个数字。举个例子:
10200 k=1
第一步: 0和1比较,此时0比1小,且还有一次可用的删除,因此删除1,保留0
第二步:因为无可用的删除次数,因此剩下的值全部保留
123450123 k=5
第一步:2>1 保留
第二步:3>2 保留
第三步: 4>3 保留
第四步: 5>4 保留
第五步:0<5 删除5 保留0 k=4
第六步: 0<4 删除4 保留0 k=3
第七步:0<3 删除3 保留0 k=2
第八步:0<2 删除2 保留0 k=1
第九步:0<1 删除1 保留0 k=0
第十步: 此时所有的删除次数用完,因此剩余的值全部保留
可以看到,当我们遇到较小值时,我们会尽可能的将其往左边移动,因为只要它比左边的值小且剩余删除次数,则删除左边的值一定会得到一个更小的值。
代码如下:
public String removeKdigits(String num, int k) {
if(num == null || num.length() == 0 || k==num.length()) return "0";
Stack<Character> stack = new Stack<>();
for(int i = 0 ; i < num.length() ; i++) {
char c = num.charAt(i);
while(k> 0 && !stack.isEmpty() && stack.peek() > c) {
stack.pop();
k--;
}
stack.push(c);
}
while(k > 0) {
stack.pop();
k--;
}
StringBuilder result = new StringBuilder();
while(!stack.isEmpty()) {
result.append(stack.pop());
}
while(result.length() > 1 && result.charAt(result.length()-1) == '0') {
result.deleteCharAt(result.length()-1);
}
return result.reverse().toString();
}
- 使用gerrit作为代码评审工具
- 如何重构你的时间序列预测问题
- 【聊】我个人眼里的ReactJs生态系统
- [WCF REST] Web消息主体风格(Message Body Style)
- apache配置https服务
- [WCF 4.0新特性] 默认绑定和行为配置
- mysql数据库及django用户名启用中文的方法
- 【学习笔记】先行者课程0109-rotate3d_变量、堆、栈
- 通过WCF扩展实现消息压缩
- Linux系统中的信号量机制
- 基于Linux与lpc3250开发板的交叉开发环境搭建
- WCF中关于可靠会话的BUG!!
- [WCF安全系列]谈谈WCF的客户端认证[Windows认证]
- ls命令实现分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Java Lombok 常用注解
- Python 基础 安装 简单的输入输出 运行一个py程序
- Python 基础 数据类型 变量常量
- Java 快速排序 关于起始方向的选择问题 为什么一定要从右边开始
- Java 使用异或进行数组元素交换时的坑 返回0的原因
- Spring BindingResult获取不到结果可能的原因之一 参数顺序 没有紧挨着校验参数
- 残差收缩网络:一种深度学习故障诊断算法
- Solr学习笔记 - 关于近实时搜索
- Solr学习笔记 - 关于timeAllowed
- Solr学习笔记 - 关于cache
- PG密码安全
- 如何利用Terraform工具编排管理TcaplusDB
- mysql隐式转换造成的查询结果不正确案例
- 【TBase开源版测评】体验安装
- 【Golang】go get遇到git fetch-pack: expected shallow list