Leetcode 402.移掉k位数字
移调k位数字
给定一个以字符串表示的非负整数 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。
题解:
从高位开始走,如果下一个数字比当前数字小,且要删除的数字次数每用完,则删除当前位置的数字,且继续向前比较,这样总能得到一个较小的序列。
具体来讲:
利用桟维持一个递增的序列,也就是说将字符串中字符依次入栈,如果当前字符比栈顶元素小,并且还可以继续删除元素,那么就将栈顶元素移掉,且继续向下一个栈顶元素比较,尽量维持序列递增,也可以算是一个贪心思想。最后移除字符串首部的所有 0 ,如果此时发现剩余的字符全为0,则输入 0 ,否则取非0 开始的前 num.length() - k 个元素构成一个序列即可。
由于最后要移除前面的 0 元素,可以用双端队列实现;
考虑到字符可以直接比较大小,所有用char[] 数组来模拟桟较为方便,最后从头往后查找定位第一个非0 元素即可。
class Solution {
public String removeKdigits(String num, int k) {
if (k <= 0) {
return num;
}
if (num.length() == 0 || k >= num.length()) {
return "0";
}
int digits = num.length() - k;// 输出字符串的长度
char[] stk = new char[num.length()];// 模拟桟
int top = 0;// 记录栈顶元素的下一个位置
for (int i = 0; i < num.length(); i++) {// 遍历所有元素
char c = num.charAt(i);
while (top > 0 && stk[top - 1] > c && k > 0) {// 如果当前元素比栈顶元素小,则出栈
top--;
k--;
}
stk[top++] = c; // 将当前元素压桟
}
// 从头开始查找头个不为0的元素位置
int idx = 0;
while (idx < digits && stk[idx] == '0') {
idx++;
}
return idx == digits ? "0" : new String(stk, idx, digits - idx); //如果0的长度=所需长度(即剩下的都是0)则输出0,否则输出前digits长度的字符串
}
}
Leetcode 402.移掉k位数字的更多相关文章
- Java实现 LeetCode 402 移掉K位数字
402. 移掉K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...
- 402. 移掉K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k.num 不会包含任何前导零.示例 1 : 输入: num ...
- LeetCode:移除K位数字【402】
LeetCode:移除K位数字[402] 题目描述 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. nu ...
- 402 Remove K Digits 移掉K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小.注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零.示例 1 :输入: ...
- [Swift]LeetCode402. 移掉K位数字 | Remove K Digits
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
- 算法——移掉K位数字使得数值最小
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. leetcode 解题思路:如果这个数的各个位是递增的,那么直接从最后面开始移除一定就是最最小的:如果这个数的 ...
- 移除K位数字
1.题目来源:选自LeetCode 402: 2.问题描述: 3.问题分析 通过分析我们可以得出这样的结论:如果后一个数字比前面的数字小的话,那么我们就要把前面的一个数字删除掉,并且每次把字符串中拆出 ...
- 算法46----移除K位数字
一.题目:移除K位数字 给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小. 注意: num 的长度小于 10002 且 ≥ k. num 不会包含任何前导零. 示 ...
- [LeetCode] 402. Remove K Digits 去掉K位数字
Given a non-negative integer num represented as a string, remove k digits from the number so that th ...
随机推荐
- Negut 上传乱码
解决办法 修改 bat 文件的 格式为ANSI格式即可
- Java开发中存在这样的代码,反而影响整体整洁和可读性
不完美的库类 不完美的库类(Incomplete Library Class) 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建立 ...
- yield和yield from
yield from的前世今生都在 这个PEP里面,总之大意是原本的yield语句只能将CPU控制权 还给直接调用者,当你想要将一个generator或者coroutine里带有 yield语句的逻辑 ...
- iOS Runloop 消息循环
介绍 Runloop是一种事件监听循环,可以理解成一个while死循环,监听到事件就起来,没有就休息. Runloop可以在不同模式下进行切换,iOS有五种模式,其中UIInitializationR ...
- -bash: mail: command not found
近日,安装了一个最小化的centos 6.3 6,用mail发送邮件进行测试的时候提示-bash: mail: command not found mailx没有安装,于是: yum -y insta ...
- sql中的exsits和not exsits
select * from table where exsits(sql语句) : 括号中sql语句有数据则返回这些相关id的数据集 select * from table where not ex ...
- Django添加tinyMCE编辑器
tinymce的使用方法很简单,只需要在html页面中包含如下: <!-- Place inside the <head> of your HTML --> <scrip ...
- Servlet The Request
The Request HTTP Protocol Parameters 所有的HTTP Protocol Parameters都会放在一个Map中, 可以通过getParameterMap得到. 对 ...
- webuploader项目中多文件上传实例
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...
- Windows10+anaconda,python3.5, 安装glove-python
Windows10+anaconda,python3.5, 安装glove-python安装glove安装之前 Visual C++ 2015 Build Tools开始安装安装glove最近因为一个 ...