做oj的时候遇到思路和方法都正确但是不能ac,只能通过几个样例
经过一番查阅,原来是Scanner的原因,Scanner读取慢,占用内存也更多
下面介绍一下Scanner的优化方法,以及读取慢的原因
BufferedReader和BufferedWritter使用
首先定义输入输出流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
使用方法:
1. String[] firstline = br.readLine().split(" "); 2. String[] secondline = br.readLine().split(" ");
注意事项:
BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)(idea快捷键alt+enter抛出异常)
readLine()方法会返回用户在按下Enter键之前的所有字符输入,不包括最后按下的Enter返回字符
br.readline()是整行读取,读取的类型是字符串,我们需要对其分割,spilt(" ")意思是以每一个空格来切割并依次放到字符数组中
既然是用于读取键盘输入,那就要用到标准输入流System.in
如果要用int类型的话,要使用Integer.parseInt()进行转换
int n=Integer.parseInt(firstline[0]);
对于输出也只能输出字符串,如果需要输出一个数字,则需要+“”以转成字符串。
最后记得用完了就把cin和cout全部close掉。
bw.write(1+""); br.close(); bw.close();
下面来看一道例题,求二进制中1的个数
https://www.acwing.com/problem/content/803/
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Main { final static int N=100010; public static void main(String[] args) throws IOException { BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); String []s=br.readLine().split(" "); int n=Integer.parseInt(s[0]); String []s1=br.readLine().split(" "); int x=0; for (int i = 0; i < n; i++) { x=Integer.parseInt(s1[i]); int count=0; while (x!=0){ x-=lowbit(x); count++; } System.out.print(count+" "); } } public static int lowbit(int x){ return x&-x; } }
接下来我们分析一下为什么Scanner比BufferReader慢很多。
Java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串,它本质上其实是使用正则表达式去读取不同的数据类型
Java.io.BufferedReader类为了能够高效的读取字符序列,从字符输入流和字符缓冲区读取文本
BufferedReader的缓冲区大小为8KB,Scanner的缓冲区大小为1KB
Scanner的平均耗时是BufferedReader的10倍左右