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
如果你觉得本篇文章对你有帮助的话,可以点个赞支持一下,感谢~