做oj的时候遇到思路和方法都正确但是不能ac,只能通过几个样例
经过一番查阅,原来是Scanner的原因,Scanner读取慢,占用内存也更多
下面介绍一下Scanner的优化方法,以及读取慢的原因
首先定义输入输出流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
使用方法:
String[] firstline = br.readLine().split(" ");
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的个数
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的平均耗时是BufferedReader的10倍左右