Scanner和BufferReader的效率问题
先给出一道题,测试平台是Acwing, 这道题是腾讯2019年春招提前批笔试第二题。题目不难,但是如果不注意细节,很容易TLE(超时)
https://www.acwing.com/problem/content/570/
下面的做法是用JAVA scanner依次读入输入数据,但这样做的效率较低,会直接导致TLE:
import java.util.Scanner; public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
for(int i = 1; i <= n; i++){
int l = in.nextInt();
int r = in.nextInt(); int sum1 = 0;
int sum2 = 0;
if(r%2 == 0)
sum1 = r/2;
else
sum1 = r/2-r;
if((l-1)%2==0)
sum2 = l/2;
else
sum2 = l/2-l; System.out.println(sum1-sum2);
}
}
}
结果如下所示,在读入超过10万行的输入的时候直接超时
好的做法是使用BufferedReader来读输入,以下代码AC
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int q = Integer.valueOf(br.readLine());
while (q-- > 0) {
String[] parts = br.readLine().split(" ");
int l = Integer.valueOf(parts[0]);
int r = Integer.valueOf(parts[1]); int k = (r-l+1)/2;
int res = 0;
if(l%2==0)
res = -k;
else
res = k;
if((r-l+1)%2==1){
if(r%2==0)
res += r;
else
res -=r;
}
System.out.println(res);
}
}
}
代码通过:
可能有人觉得Scanner我也可以使用整行读入的方式呀,可是这样仍然会TLE:
import java.util.Scanner; public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();//Scanner读入一个int后, 读入指针仍然停留在该行
in.nextLine();//必须消耗掉上一行的所有数据,读到\n,才能去读下一行,因此这里用nextLine()消耗掉上一行的末尾
for(int i = 1; i <= n; i++){
String[] parts = in.nextLine().split(" ");
int l = Integer.valueOf(parts[0]);
int r = Integer.valueOf(parts[1]); int k = (r-l+1)/2;
int res = 0;
if(l%2==0)
res = -k;
else
res = k;
if((r-l+1)%2==1){
if(r%2==0)
res += r;
else
res -=r;
}
System.out.println(res);
}
}
}
说明Scanner在读入大量数据的时候确实不如BufferedReader的效率高!
有人作了测试:
从测试结果来看,Scanner的平均耗时是BufferedReader的10倍左右.
在这里贴上关于Scanner和BufferedReader的对比分析。
BufferedReader可以用来读取文件或者接收来自键盘(控制台)的信息。它比Scanner更加快捷,能够大幅度缩短程序运行时间。它下面的readline()方法可以一次性读取一行文字(String),非常方便。需要注意的是,使用BufferedReader对象的readLine()方法必须处理java.io.IOException异常(Exception)。以及,在使用完BufferredReader以后,需要用close()方法关闭流。
可以从源码上看看这两者之间的区别
【Java8源码分析】IO包-Reader、BufferedReader和Scanner总结
这里面有点类似与,C++提供的cin输入流的效率远不如C的scanf函数效率高
Scanner和BufferReader的效率问题的更多相关文章
- Scanner和BufferReader之区别
在Java SE6中我们可知道一个非常方便的输入数据的类Scanner,位于java.util包中,这个Scanner的具体用法为Scanner in = new Scanner(System.in) ...
- Java输入流之BufferReader和Scanner的用法!
在Java中,我们都知道Java的标准输入串是System.in.但是我们却很少在Java中看到谁使用它,这是因为我们平时输入的都是一个字符串或者是一个数字等等.而System.in提供的read方法 ...
- Java中Scanner类和BufferReader类之间的区别
java.util.Scanner类是一个简单的文本扫描类,它可以解析基本数据类型和字符串.它本质上是使用正则表达式去读取不同的数据类型. Java.io.BufferedReader类为了能够高效的 ...
- 转:Java中Scanner类和BufferReader类之间的区别
原文地址:https://blog.csdn.net/u014717036/article/details/52227782 java.util.Scanner类是一个简单的文本扫描类,它可以解析基本 ...
- BufferedReader与Scanner的区别
在Java中,我们都知道Java的标准输入串是System.in.但是我们却很少在Java中看到谁使用它,这是因为我们平时输入的都是一个字符串或者是一个数字等等.而System.in提供的read方法 ...
- java中输入方式Scanner和BufferedReader
Scanner 在java.util包中,需要引入时可以用import java.util.*;或者import java.util.Scanner; 工作原理:通过new创建一个Scanner对象, ...
- 【CodeChef】Enormous Input Test
The purpose of this problem is to verify whether the method you are using to read input data is suff ...
- Java控制台读写
Java控制台读写 控制台读 Java中进行控制台读操作主要是通过Scanner,BufferReader,Console类进行 1. Scanner Scanner对象定义 在控制台 Scanner ...
- Java第8次实验(IO流)
参考资料 本次作业参考文件 正则表达式参考资料 第1次实验 1. 字符流与文本文件:使用 PrintWriter(写),BufferedReader(读) 参考文件:基础代码目录Student.jav ...
随机推荐
- 获取 wx.getUserInfo 接口后续将不再出现授权弹窗,请注意升级(微信小程序开发)
微信小程序开发时,Console 提示:获取 wx.getUserInfo 接口后续将不再出现授权弹窗,请注意升级 错误原因: 直接调用这个方法依旧可以获取用户信息, 但是如果你之前没有点击过那个授权 ...
- Bootstrap 实战之响应式个人博客 (二)
阅读本博文前请参考:Bootstrap 实战之响应式个人博客 (一) 一.博客 1.结构 整体博客详情页的结构共包括四部分: 导航栏 博客主体内容 右侧栏:全局搜索框,广告位,推荐阅读 页尾 其中导航 ...
- 后端开发者的Vue学习之路(三)
目录 上节内容回顾 组件 什么是组件 组件注册 全局注册组件 局部注册组件 使用细节 组件注册的命名规范: 组件中只有一个根元素 组件也是一个实例 组件在某些元素中渲染出错 组件间的数据传递 父子组件 ...
- arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- 工程造价数据服务云平台(造价BIM)
为响应招标人的<ZQH工程造价数据平台>的技术邀约,特作以下陈述. 经过多次沟通和对招标文件的理解,招标人通过软件平台建立和使用人员库.项目库.材料设备价格库.数据库等四库的真实需求,本着 ...
- linux命令df中df -h和df -i
df 命令: linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [ ...
- Java基础static的探究
static方法就是没有this的方法. 在static方法内部不能调用非静态方法, 但是在非静态的方法中可以调用静态的方法和变量. 而且可以在没有创建任何对象的前提下,仅仅通过类本身来调用stati ...
- TCP/IP、UDP、HTTP、SOCKET详解
文章大纲 网络OSI七层及各层作用 TCP与UDP基本介绍 TCP连接过程详解 SOCKET原理与连接详解 一.网络OSI七层及各层作用 应用层:文件传输,电子邮件,文件服务,虚拟终端 T ...
- 容器化系列 - 通过Grafana监测InfluxDB数据 on Docker
本文演示在Docker中运行Grafana和InfluxDB,并通过Grafana展示InfluxDB曲线图. 1 准备工作 1.1 安装Docker 请参考这里 1.2 下载镜像 $ docker ...
- 解决sqlserver数据库显示单个用户
今天突然发现数据库显示为单个用户并且,访问速度超慢,执行以下语句解决了 USE master; GO DECLARE @SQL VARCHAR(MAX); SET @SQL='' SELECT @SQ ...