博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Scanner和BufferReader的效率问题
阅读量:4647 次
发布时间:2019-06-09

本文共 2275 字,大约阅读时间需要 7 分钟。

先给出一道题,测试平台是Acwing, 这道题是腾讯2019年春招提前批笔试第二题。题目不难,但是如果不注意细节,很容易TLE(超时)

下面的做法是用JAVA scanner依次读入输入数据,但这样做的效率较低,会直接导致TLE:

1 import java.util.Scanner; 2  3 public class Main { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 int n = in.nextInt(); 7 for(int i = 1; i <= n; i++){ 8 int l = in.nextInt(); 9 int r = in.nextInt();10 11 int sum1 = 0;12 int sum2 = 0;13 if(r%2 == 0)14 sum1 = r/2;15 else16 sum1 = r/2-r;17 if((l-1)%2==0)18 sum2 = l/2;19 else20 sum2 = l/2-l;21 22 System.out.println(sum1-sum2);23 }24 }25 }

结果如下所示,在读入超过10万行的输入的时候直接超时

 

好的做法是使用BufferedReader来读输入,以下代码AC

1 import java.io.BufferedReader; 2 import java.io.IOException; 3 import java.io.InputStreamReader; 4  5  6 public class Main { 7  8  9 public static void main(String[] args) throws IOException {10 BufferedReader br = new BufferedReader(new InputStreamReader(System.in));11 int q = Integer.valueOf(br.readLine());12 while (q-- > 0) {13 String[] parts = br.readLine().split(" ");14 int l = Integer.valueOf(parts[0]);15 int r = Integer.valueOf(parts[1]);16 17 int k = (r-l+1)/2;18 int res = 0;19 if(l%2==0)20 res = -k;21 else22 res = k;23 if((r-l+1)%2==1){24 if(r%2==0)25 res += r;26 else27 res -=r;28 }29 System.out.println(res);30 }31 }32 }

代码通过:

可能有人觉得Scanner我也可以使用整行读入的方式呀,可是这样仍然会TLE:

1 import java.util.Scanner; 2  3 public class Main { 4 public static void main(String[] args) { 5 Scanner in = new Scanner(System.in); 6 int n = in.nextInt();//Scanner读入一个int后, 读入指针仍然停留在该行 7 in.nextLine();//必须消耗掉上一行的所有数据,读到\n,才能去读下一行,因此这里用nextLine()消耗掉上一行的末尾 8 for(int i = 1; i <= n; i++){ 9 String[] parts = in.nextLine().split(" ");10 int l = Integer.valueOf(parts[0]);11 int r = Integer.valueOf(parts[1]);12 13 14 int k = (r-l+1)/2;15 int res = 0;16 if(l%2==0)17 res = -k;18 else19 res = k;20 if((r-l+1)%2==1){21 if(r%2==0)22 res += r;23 else24 res -=r;25 }26 System.out.println(res);27 }28 }29 }

 说明Scanner在读入大量数据的时候确实不如BufferedReader的效率高!

有人作了测试:

 

 

BufferedReader可以用来读取文件或者接收来自键盘(控制台)的信息。它比Scanner更加快捷,能够大幅度缩短程序运行时间。它下面的readline()方法可以一次性读取一行文字(String),非常方便。需要注意的是,使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)。以及,在使用完BufferredReader以后,需要用close()方法关闭流

可以从源码上看看这两者之间的区别

这里面有点类似与,C++提供的cin输入流的效率远不如C的scanf函数效率高

转载于:https://www.cnblogs.com/greatLong/p/10658267.html

你可能感兴趣的文章
Netty4.x中文教程系列(四) 对象传输
查看>>
linux下find命令使用举例、
查看>>
GET请求在Tomcat中的传递及URI传递
查看>>
ubuntun 服务器与Mac
查看>>
重温JSP学习笔记--与日期数字格式化有关的jstl标签库
查看>>
java-Date-DateFormat-Calendar
查看>>
封装CLLocationManager定位获取经纬度
查看>>
我的第一篇博客-(Eclipse中或Myeclipse中如果不小心删除了包那可怎么办?)
查看>>
对easyui datagrid组件的一个小改进
查看>>
类似以下三图竞争关系的IT企业
查看>>
清明节
查看>>
ubuntu如何安装svn客户端?
查看>>
javascript之非构造函数的继承
查看>>
C#实现 单点登录(SSO)
查看>>
高精度计算(2015.8.1)
查看>>
cocos2d-x tile map瓦片地图的黑线及地图抖动解决方案
查看>>
软工网络15团队作业2——团队计划
查看>>
Android屏幕适配
查看>>
ps简单操作文档
查看>>
CSS之float样式
查看>>