java-算法基础优化
一、ACM风格输入输出(高效,替换原有的输入输出流)
1.推荐原因:(内存托管)
对于原本的Scanner读取流,只能根据行来读取数据,而BufferredReader读取信息可以直接读取整个文件,动态地调用读取方法(给你一个指针,指向了以空格和换行分割的输入内容的缓存,通过调用方法直接从缓存中读取数据),从而提高IO效率。
同理,对于原本的System.out输出,我们也可以使用这种缓存托管的思想来控制输出,避免读取一次数据就只发一次信息,需要多次IO
2.BufferedReader读取
引入BufferedReader
static BufferedReader br = new BufferedReader(new InputStreamReader(new BufferedInputStream(System.in)));
(1)一般使用:
和Scanner差不多,是按行读取数据
调用br--BufferedReader 的对象
String input = br.readLine();
int input = br.read();
(2)进阶使用:
通过控制指针,按需读取信息(已经根据空格和换行切分好了,按单一获取数据)
创建托管对象:StreamTokenizer
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StreamTokenizer st = new StreamTokenizer(br);
获取st指针中的信息:
int aaa = st.nval
更新指针指向:
st.nextToken();
3.PrintWriter输出
引入PrintWriter:
static PrintWriter out =new PrintWriter(new OutputStreamWriter(System.out));
执行输出:
注意,输出需要调用两个方法,
- .println方法看起来是输出,实际上是将信息存入输出缓存
out.println(st.nval);// out是前面定义的对象,这是调用对象的方法
- .flush方法其实是一口气把所有缓存数据输出
out.flush()// out是前面定义的对象,这是调用对象的方法
4.实际使用:
主要是存在大量数据时才使用
- 完成输入输出流的引入
/**
和前面一样
*/
- 编写循环,控制读取并输出
while(in.nextToken()!=StreamTokenizer.TT_EOF){
// 一系列操作
out.println(st.nval);// out是前面定义的对象,这是调用对象的方法
}
out.flush()// out是前面定义的对象,这是调用对象的方法
- 关闭流资源
out.close;
br.close
// st不是流资源
二、静态化储存空间(手动复用的内存,减少判定时内存的损耗)
1.推荐原因:(复用内存)
在算法比赛中,每次开辟空间都算做一次内存增加,如果碰到大数据、多循环的情况,可能判定内存过大,为了减少这种情况,我们不妨对复用型的存储空间进行静态化、固定化
2.实现方法:
静态化存储空间,后续手动控制其增删改查
public static int MAX_N = 800;
public static int MAX_M = 800;
public static int[][] arr = new int[MAX_N][MAX_M]