Java中等题-移掉k位数字(力扣)
给你一个以字符串表示的非负整数 num
和一个整数 k
,移除这个数中的 k
位数字,使得剩下的数字最小。请你以字符串形式返回这个最小的数字。
示例 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
正确的代码如下:
class Solution {
public String removeKdigits(String num, int k) {
char[] chars = num.toCharArray();
int n=chars.length;
Deque<Character>deque=new ArrayDeque<>();
for(int i=0;i<n;i++){
char ch=chars[i];
while(deque.size()!=0&&k>0&&deque.peekLast()>ch){
deque.pollLast();
k--;
}
deque.offerLast(ch);
}
while(k>0){
deque.pollLast();
k--;
}
StringBuilder sb=new StringBuilder();
boolean zero=true;
while(deque.size()>0){
char di=deque.pollFirst();
if(zero&&di=='0'){
continue;
}
zero=false;
sb.append(di);
}
return sb.length()==0?"0":sb.toString();
}
}