import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param num string字符串
* @param k int整型
* @return string字符串
*/
public String findSmallestNumber (String num, int k) {
int n = num.length();
if (k >= n) {
return "0";
}
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < n; i++) {
char c = num.charAt(i);
// 栈不为空,栈顶元素大于当前字符并且k>0,因为找的是最小数字
while (!stack.isEmpty() && stack.peekLast() > c && k > 0) {
stack.pollLast();
k--;
}
stack.offerLast(c);
}
// 如果k依然大于0,继续出栈
while (k > 0) {
stack.pollLast();
k--;
}
StringBuilder stringBuilder = new StringBuilder();
// 得到数字字符串,要正序得到
while (!stack.isEmpty()) {
stringBuilder.append(stack.removeFirst());
}
// 去除前导0
while (stringBuilder.length() > 1 && stringBuilder.charAt(0) == '0') {
stringBuilder.deleteCharAt(0);
}
return stringBuilder.toString();
}
}
本题知识点分析:
1.贪心算法
2.栈的出栈和出栈
3.字符串StringBuilder单线程最快
本题解题思路分析:
1.如果k>=字符串长度,表明返回的肯定是0
2.利用ArrayDeque,可以实现双端队列的功能,LinkedList也可以,性能差一点
3.出栈条件: 栈不为空,栈顶元素大于当前字符并且k>0,因为找的是最小数字
4.如果k依然大于0,继续出栈
5.因为要得到数字,而栈是逆序存储,因此双端队列发挥作用,从首部拿到元素
6.去除前导0的情况
本题使用编程语言: Java
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~

京公网安备 11010502036488号