最近用Java刷题的时候,在时间复杂度已经最优化的情况下依然超时,经过分析,发现是我经常用的输入Scanner和输出System.out.print()在时间效率上比较低。
这里我用ACWing上的一道题作为示例:
这是我的代码:
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s1 = sc.next();
String s2 = sc.next();
StringBuilder sb = new StringBuilder();
Set<Character> set = new HashSet<>();
for(int i=0;i<s2.length();i++){
set.add(s2.charAt(i));
}
for(char c : s1.toCharArray()){
if(!set.contains(c)){
sb.append(c);
}
}
System.out.println(sb.toString());
}
}
显示超时了!!!
看了许多大佬的题解后,发现他们用的是快读快写:
import java.io.*;
import java.util.HashSet;
import java.util.Set;
public class Main {
static Set<Character> set = new HashSet<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s1 = br.readLine();
String s2 = br.readLine();
for (int i = 0; i < s2.length(); i++) {
set.add(s2.charAt(i));
}
for (int i = 0; i < s1.length(); i++) {
char c = s1.charAt(i);
if (set.contains(c)) {
continue;
} else {
bw.write(c);
}
}
bw.flush();
}
}
快读
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
快写
BufferedWriter w = new BufferedWriter(new OutputStreamWriter(System.out));
要注意的是要抛出异常:throws IOException
参考:
java算法竞赛必备之快读快写(超详细解读)