注意点
1.总共需要删k个数。首先,考虑特殊情况,如果数字全部递增则倒着删。因此,维护已遍历的数为单调递增。遇到逆序的则将前面大于该数字的都删除。有两种情况:1.逆序的次数小于k则遍历完所有字符后 剩余k>0,从后往前删2.逆序的次数大于k则只删k次
2.LinkedList如果使用for循环遍历则会超时 迭代器遍历O(n) for循环O(n2)
import java.util.*;
class Main{
public static void main(String[] args){
//读入数据
Scanner in = new Scanner(System.in);
String str = in.next();
int k = in.nextInt();
LinkedList<Character> list = new LinkedList<>();
//遍历字符串
for(int i = 0 ; i < str.length() ; i++){
//判断链表最后的数是否大于当前遍历到的字符,即是否构成逆序
while(!list.isEmpty() && k>0 && list.peekLast()>str.charAt(i)){
list.removeLast();
k--;
}
list.addLast(str.charAt(i));
}
//如果逆序次数比k小,因为目前链表中的数据已经构成了递增,则直接从尾部开始删除
while(!list.isEmpty() && k-->0){
list.removeLast();
}
//移除链表前导0
while(!list.isEmpty() && list.peekFirst()=='0'){
list.removeFirst();
}
//判断当前链表是否为空
if(list.isEmpty()){
System.out.println("0");
return;
}
//使用迭代器遍历链表。注意:此时如果使用for循环遍历则会超时 迭代遍历O(n) for循环O(n2)
Iterator iterator = list.iterator();
StringBuilder sb = new StringBuilder();
while(iterator.hasNext()){
sb.append(iterator.next());
}
System.out.println(sb.toString());
}
}