一次由 Scanner(System.in) 引起的 TLE

简介: 继昨天一次由System.out.println() 引起的 MLE&TLE后,今天随机到一道快速选择的题(P1923),又遇到相似的问题,写完快速排序后修改几行代码就得到快速选择的代码,本以为轻松解决问题,然后又莫名其妙的 TLE。

莫名其妙 TLE


  继昨天一次由System.out.println() 引起的 MLE&TLE后,今天随机到一道快速选择的题(P1923),又遇到相似的问题,写完快速排序后修改几行代码就得到快速选择的代码,本以为轻松解决问题,然后又莫名其妙的 TLE


原始代码:


public static void main(String[] args) throws IOException {
Scanner in = new Scanner(System.in);// 标准输入
int n = in.nextInt();
int k = in.nextInt();
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = in.nextInt();
}
quickSelect(a, 0, n-1, k);// 快速选择
System.out.println(a[k]);// 标准输出
in.close();
}


第一次尝试结果:




举一反三


  有了昨天 System.out.println() 造成MLE 的经验,很容易就想到是因为使用Scanner(System.in)标准输入性能低下造成的 TLE,于是进行改进。

// 使用 StreamTokenizer 替代Scanner in = newScanner(System.in);
StreamTokenizer in =
  new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));

最终代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
public class Main {
// StreamTokenizer对象
public static StreamTokenizer in =
new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
// 由 Token获取 int
public static int nextInt() throws IOException {
in.nextToken();// 从输入流获取标记
return (int)in.nval;// 转化
}
// 主函数
public static void main(String[] args) throws IOException {
int n = nextInt();// 自编写的读取整数函数
int k = nextInt();
int[] a = new int[n];
for (int i = 0; i < n; ++i) {
a[i] = nextInt();
}
quickSelect(a, 0, n-1, k);
System.out.println(a[k]);
}
}


最终结果:




总结


  • 使用 Scanner(System.in) 进行标准输出时,性能较差,不适合频繁调用。
  • 频繁输入调用使用 StreamTokenizer in = new      StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
  • java.io.StreamTokenizer 可以获取输入流并将其分析为Token(标记),使用nextToken()方法读取下一个标记。
  • 默认情况下,StreamTokenizer 认为下列内容是Token字母数字cc++注释符号以外的其他符号
  • 使用 BufferedReader 创建 StreamTokenizer 对象以提高效率
  • 调用 nextToken() 方法从输入流中获取标记,调用 nextToken() 方法后,如果 Token      是字符串,可用String s = st.sval获取,如果是整数,可用int x = (int)st.nval获取。
相关文章
|
SQL Java 数据库连接
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
432 0
JAVAEE框架技术之7-myBatis ORM框架入门基础CRUD
|
开发框架 JavaScript 前端开发
从零到一:搭建Vue3后台管理系统
本文将在《从零到一:搭建一个Vue3开发框架》基础上搭建Vue3后台管理系统,所以如果您没有看过上篇文章或者想了解如何从零到一搭建Vue3开发框架,可以先看一下上篇文章。
|
移动开发 小程序 前端开发
|
9月前
|
数据采集 安全 数据可视化
数据清洗必看的7个要点
数据清洗是确保分析准确的关键。本文详解七大要点:了解数据、处理缺失值、去重、统一格式、处理异常值、转换类型及验证逻辑一致性,助你打好数据分析基石,避免“垃圾进垃圾出”。
|
存储 缓存 监控
Flink内存管理机制及其参数调优
Flink内存管理机制及其参数调优
|
监控 Java 数据库连接
年薪百万的offer从何入手?剑指P8的《Spring 5高级编程》PDF
如果想要解释Spring,那么最难的部分就是对其进行分类。通常情况下,Spring 被描述为构建Java应用程序的轻量级框架,但这种描述带来了两个有趣的观点。
年薪百万的offer从何入手?剑指P8的《Spring 5高级编程》PDF
|
API
mac终端常用命令
1、操作终端的常用命令 2、目录和文件操作 3、常用命令 4、进程操作 5、图标与键盘对应快捷键 6.webshell常用查看日志命令
691 0
阿里云ACA认证是不是很简单?怎么样能考过?
对于很多应届毕业生来说,在即将踏入社会时,最需要的就是能丰富自己简历的工具,尤其是对于IT行业的人来说,刚毕业能不能获得进入互联网大厂的机会,是至关重要的;另一方面,很多工作了几年后想转行的人,自己本身没有什么基础,但还是想进入IT这个高薪行业来给自己的人生带来新现象。
2354 0
阿里云ACA认证是不是很简单?怎么样能考过?
|
存储 机器学习/深度学习 数据挖掘
深度学习修炼(二)—— 数据集与模型
本文主要讲述了如何使用pytorch加载数据集和模型
918 0
|
人工智能 达摩院 监控
观点 | 联合八大业务构建生态体系 阿里云究竟能给文旅做什么?
疫情影响一直在延续,何时会迎来拐点也尚未可知。在这样的情况下,文旅企业该如何自救,又该在疫情窗口期做些什么?
1828 0
观点 | 联合八大业务构建生态体系 阿里云究竟能给文旅做什么?