20150301图形旋转(Scanner与BufferedReader)
BufferedReader与Scanner(20150301图形旋转)
做题在做CCF(2015-03-01)的题目的时候遇到了一个问题,由于自己之前一直用C在写,现在改用Java,结果一开局就遇到了这个问题,当时自己百度也没找到为什么,然后去百度搜答案,全部都是80分的,问了周边的人,他们也不知道,最后在自己研究了几个小时之下,明白了这个道理
BufferdReader与Scanner
BufferedReader:
BufferedReader在读取数据的时候,由于自身类拥有8192字符的缓冲区,因此在读入的数据(键盘、t’x’t文件)时候,会先将其读入缓存区中,之后在使用reade()方法从缓存区中取文件
==此处不在说缓冲区数据充足与不满的情况,大家自行百度 ==
Scanner
Scanner写java的人应该都是在熟悉不过的,它主要就是读取用户在命令行的各种数据。此处省略1W字介绍scanner,接下来我们来说说,Scanner与Buf’feredReader的性能区别
Scanner与Buffered性能:
当我们从键盘获取数据的时候,每一次Scanner消耗的时长都要小于BufferedReader。Scanner的平均耗时大约是BufferedReader的10个倍左右。因此我们在做题时候发现,无论怎么改代码都是运行内存超限制,现在应该有所了解了。
所以告诫大家,如果下次还是做CCF/CSP的认证的时候,建议遇到二维数组的时候使用BufferedReader类,这样性能会提升不少。
BufferedReader语法
BufferedReader类位于Java.io中因此在使用的时候。需要用import导入包。在BufferedReader这个类中的reader Line()方法处理Java.io.IOEcxception的异常抛出,这里可能理解有问题,我们直接来看用法,用法都是固定的:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String[] tt = input.readLine().split(" ");
int n = Integer.parseInt(tt[0]);
reader Line()方法返回用户按下回车键以前的字符。split(“ ”)指的是按照空格进行分离。
接下来我们来看题目
CCF计算机能力认证201503-1(图形旋转)
代码如下:(自己写的,运行通过,节约了接近200M的内存,大家可以参考一下).
import java.util.Scanner;
import java.io.*;
public class w20150301 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
Scanner in = new Scanner (System.in);
BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String[] tt = input.readLine().split(" ");
int n = Integer.parseInt(tt[0]);//行
int m = Integer.parseInt(tt[1]);//列
int [][]num1= new int[n][m];
int [][]num2= new int[m][n];
for (int t = 0; t < n; t++) {
String[] str = input.readLine().split(" ");
for(int i = 0; i < str.length; i++) num1[t][i] = Integer.parseInt(str[i]);
}
for(int i = 0; i< num1.length; i++)
for (int j = 0; j <num1[i].length; j++)
num2[j][i] = num1[i][j];
for(int i = num2.length-1; i>= 0; i--) {
for (int j = 0; j < num2[i].length; j++)
System.out.print(num2[i][j]+" ");
System.out.println();
}
}
}