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 ...
随机推荐
- ASP.NET MVC 复制MVC项目代码到同一个项目的时候报错The request for ‘home’ has found the following matching controll
ASP.NET MVC 复制MVC项目代码到同一个项目的时候报错The request for ‘home’ has found the following matching controll “/” ...
- java数据结构和算法06(红黑树)
这一篇我们来看看红黑树,首先说一下我啃红黑树的一点想法,刚开始的时候比较蒙,what?这到底是什么鬼啊?还有这种操作?有好久的时间我都缓不过来,直到我玩了两把王者之后回头一看,好像有点儿意思,所以有的 ...
- jmeter并发定时器
jmeter并发定时器
- ubuntu 14.04 安装redis
root@hett-PowerEdge-T30:~# sudo apt-get install redis-server Reading package lists... DoneBuilding d ...
- SQLite C/C++ 教程
目录 1安装 2 C/C++ Interface APIs 3连接到数据库 4创建表 5插入操作 6更新操作 7删除操作 安装 在我们开始使用SQLite在C / C++程序,我们需要确保SQLite ...
- POJ2402 Palindrome Numbers第K个回文数——找规律
问题 给一个数k,给出第k个回文数 链接 题解 打表找规律,详见https://www.cnblogs.com/lfri/p/10459982.html,差别仅在于这里从1数起. AC代码 #inc ...
- 多源最短路径floyd
#include<iostream> #define INF 105 using namespace std; int main() { ][],mark,x,y,g; while(cin ...
- postman使用--构建工作流和newman
构建工作流 在使用“Collection Runner”的时候,集合中的请求执行顺序就是请求在Collection中的显示排列顺序.但是,有的时候我们不希望请求按照这样的方式去执行,可能是执行完第一个 ...
- synchronized 和ReentrantLock的区别
历史知识:JDK5之前,只有synchronized 可以用,之后就有了ReetrantLock可以用了 ReetrantLock (再入锁) 1.位于java.util.concurrnt.lock ...
- Bootstrap历练实例:小的按钮
<!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...