最近刷题总是会遇到超时问题,无论代码怎么改就是过不了,上网找了一些资料才知道,原来Scanner输入的时间消耗这么大,这是原题大家可以去看看:http://118.190.20.162/view.page?gpid=T104
1、用BufferedReader 代替Scanner可以节省时间
class Reader {
static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer tokenizer = new StringTokenizer("");
static String nextLine() throws IOException{// 读取下一行字符串
return reader.readLine();
}
static String next() throws IOException {// 读取下一个字符串
while (!tokenizer.hasMoreTokens()) {
tokenizer = new StringTokenizer(reader.readLine());
}
return tokenizer.nextToken();
}
static int nextInt() throws IOException {// 读取下一个int型数值
return Integer.parseInt(next());
}
static double nextDouble() throws IOException {// 读取下一个double型数值
return Double.parseDouble(next());
}
}
nextLine()就相当于Scanner.nextLine();
next()就相当于Scanner.next();
nextInt()就相当于Scanner.nextInt();
nextDouble()就相当于Scanner.nextDouble();
主函数中需要读取输入时,直接使用类似Reader.next()语法即可
2、当需要对String字符串增添或删除字符时,用StringBuilder或StringBuffer类来替代String类。由于StringBulider速度比StringBuffer快,所以StringBulider在OJ比赛中更常用。Java中,String对象是不可变的,所以利用+会建立一个新字符串对象,这是十分费时的,而StringBuilder或StringBuffer类对象是可变的,可以添加、删除和修改字符。StringBuilder的常用方法如下:
//建立一个空StringBuilder对象
StringBuilder s=new StringBuilder();
System.out.println(s);
//建立一个初始化为“0000”字符串的StringBuilder对象
StringBuilder s1=new StringBuilder("0000");
System.out.println(s1);
//在StringBuilder对象尾部添加"0000"字符串
s.append("0000");
System.out.println(s);
//在StringBuilder对象的0号索引位置之前添加"1111"字符串
s.insert(0,"1111");
System.out.println(s);
//在StringBuilder对象的1号索引位置之前添加"2222"字符串
s.insert(1,"2222");
System.out.println(s);
//修改StringBuilder对象5号索引位置的字符为'A'字符
s.setCharAt(5, 'A');
System.out.println(s);
//将StringBuilder对象转换为字符串
String s3=s.toString();
System.out.println(s3);
输出结果:
3、当需要访问字符串中的某个字符或需要遍历整个字符串的每一个字符时,先用toCharArray()方法将String转换为char数组,再进行遍历,不要使用String的CharAt方法
4、最近又学到了两个东西,来补充一些
- 快读模板压缩版:
BufferedReader in= new BufferedReader(new InputStreamReader(System.in));
- 不想刷oj的时候总是复制粘贴,所以先在当前目录准备一个txt文件,然后复制一次,一直到你删除这个文件,就不用复制多次
BufferedReader in = new BufferedReader(new InputStreamReader(new FileInputStream("inc.txt")));
其实这两个点都是一个原理,就是输入流不一样,第一个是从键盘输入,第二个是从文件输入。
这里还有一个,是我在api文件看到的,但是不推荐用,原因就是太慢了,我们学快读模板就是为了解决读写太慢的问题:
BufferedReader in= new BufferedReader(new FileReader("foo.in"));
以上。