Adv193 算法提高 盾神与条状项链
题目如下:
这题直接用LinkedList会超时,把Scanner换成输入挂才800ms过,所以可以不用LinkedList,用ArrayList也ok
package adv;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.List;
import java.util.StringTokenizer;
/**
* @Description: 算法提高 盾神与条状项链
* @ClassName: Adv193
* @author: fan.yang
* @date: 2020/07/31 14:12
*/
public class Adv193 {
//题目有提示链表的。理所应当想到了LinkedList,但这道题对于链表不友好(只提供值,不提供序号),不想点办法会超时
// 这道题其实也没必要LinkedList,ArrayList也可以完成,而且更快
public static void main(String[] args) throws Exception{
InputReader inputReader = new InputReader(System.in);
List<Integer> list = new LinkedList<>();
int n = inputReader.nextInt();
int m = inputReader.nextInt();
for(int i = 0;i < n;i++){
list.add(inputReader.nextInt());
}
while(m-- > 0){
switch (inputReader.next()){
case "ADD": //按序号增加是快的,但题目只是提供了值,所以找到这个值所在的序号还是很慢
list.add(list.indexOf(inputReader.nextInt()), inputReader.nextInt());
break;
case "DEL": //链表删除快在按序号的删除,按值删除还需要从头开始找到那个值,这个过程很慢
list.remove(Integer.valueOf(inputReader.nextInt()));
}
}
System.out.println(list.size());
list.stream().forEach(e -> System.out.print(e + " "));
}
}
//java输入挂 替代Scanner
class InputReader {
private BufferedReader reader;
private StringTokenizer tokenizer;
InputReader(InputStream in) {
reader = new BufferedReader(new InputStreamReader(in));
tokenizer = new StringTokenizer("");
}
public String next() throws IOException {
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
public Integer nextInt() throws IOException {
return Integer.parseInt(next());
}
}