题目:
我的解法:
class Solution {
public String removeKdigits(String num, int k) {
// 建立一个ArrayList来储存每一个数字
List<Integer> list = new ArrayList<Integer>();
int d = num.length();
for(int i=0; i<d; i++){
Integer n = Integer.parseInt(String.valueOf(num.charAt(i)));
list.add(n);
}
// 找到当前list中,相邻两个数,前一个大于后一个的情况,删除前一个数,同时记录删除的次数
int rm_count = 0;
for(int m=0; m<k; m++){
int l = list.size();
for(int j=0; j+1<l; j++){
if(list.get(j)>list.get(j+1)){
list.remove(j);
rm_count++;
break;
}
}
}
// 如果删除的次数少于要求的,则当前list为递增数组,按照次数差值,删除最末尾数字
if(rm_count<k){
for(int p=0; p<k-rm_count; p++){
list.remove(list.size()-1);
}
}
// 将list中剩余的数字转换为String,需要注意开头数字为0的情况
boolean haveNotZeroVal = false;
StringBuilder sb = new StringBuilder();
for(Integer each: list){
if(haveNotZeroVal){
sb.append(each);
}else{
if(each!=0){
haveNotZeroVal = true;
sb.append(each);
}else{
continue;
}
}
}
if(sb.toString().length() == 0){
return "0";
}
return sb.toString();
}
}
官方题解:
class Solution {
public String removeKdigits(String num, int k) {
Deque<Character> deque = new LinkedList<Character>();
int length = num.length();
for (int i = 0; i < length; ++i) {
char digit = num.charAt(i);
while (!deque.isEmpty() && k > 0 && deque.peekLast() > digit) {
deque.pollLast();
k--;
}
deque.offerLast(digit);
}
for (int i = 0; i < k; ++i) {
deque.pollLast();
}
StringBuilder ret = new StringBuilder();
boolean leadingZero = true;
while (!deque.isEmpty()) {
char digit = deque.pollFirst();
if (leadingZero && digit == '0') {
continue;
}
leadingZero = false;
ret.append(digit);
}
return ret.length() == 0 ? "0" : ret.toString();
}
}
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-k-digits/solution/yi-diao-kwei-shu-zi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。