java_acm快速输入和输出

54 篇文章 0 订阅
4 篇文章 0 订阅

快速输入和输出:

平常我们在用Java做acm题目的时候,都是用

  1. Scanner cin = new Scanner(System.in);  
  2. int num = cin.nextInt();  
  3. System.out.println(num);  
Scanner cin = new Scanner(System.in);
int num = cin.nextInt();
System.out.println(num);
正常情况下都是是够用;不过当输入量和输出量太大的时候(达到百万到千万),那么这种输出方式就不够用了。


就用hdu上的1003题(MaxSum)作为例子:

这道题是是一个最大子串和问题,这个不是讨论的重点,在算法正确的写法(就是T*n耗时)之后发现内存爆了

主要是上述输入和输出的时候消耗的。

我们改用字符流来读写数据的话,结果就变成了:


这就是快速输入和输出的作用(当然我的代码可能不够完善,仅供借鉴)

AC代码如下:

  1. import java.io.IOException;  
  2. import java.io.InputStreamReader;  
  3. import java.io.OutputStreamWriter;  
  4. import java.io.Reader;  
  5. import java.io.Writer;  
  6.   
  7. public class Main {  
  8.     private static Reader reader = null;  
  9.     private static Writer writer = null;  
  10.   
  11.     public static void main(String[] args) {  
  12.         reader = new InputStreamReader(System.in);  
  13.         writer = new OutputStreamWriter(System.out);  
  14.         int n = getInt();  
  15.         try {  
  16.             for (int i = 1; i <= n; i++) {  
  17.                 int m, max = 0, sum, st, en, p;  
  18.                 int a;  
  19.                 if (i != 1) {  
  20.                     writer.write("\r\n");  
  21.                     writer.flush();  
  22.                 }  
  23.                 m = getInt();  
  24.                 sum = 0;  
  25.                 st = en = p = 0;  
  26.                 for (int j = 0; j < m; j++) {  
  27.                     a = getInt();  
  28.                     if (j == 0) {  
  29.                         max = a;  
  30.                     }  
  31.                     sum += a;  
  32.                     if (sum > max) {  
  33.                         max = sum;  
  34.                         st = p;  
  35.                         en = j;  
  36.                     }  
  37.                     if (sum < 0) {  
  38.                         sum = 0;  
  39.                         p = j + 1;  
  40.                     }  
  41.                 }  
  42.                 st++;  
  43.                 en++;  
  44.                 writer.write("Case " + i + ":" + "\r\n");  
  45.                 writer.write(max + " " + st + " " + en + "\r\n");  
  46.                 writer.flush();  
  47.             }  
  48.         } catch (Exception e) {  
  49.             e.printStackTrace();  
  50.         }  
  51.     }  
  52.   
  53.     /** 
  54.      * 获取键盘输入的整数 
  55.      *  
  56.      * @return 输入的整数 
  57.      */  
  58.     public static int getInt() {  
  59.         int read;  
  60.         int res = 0;  
  61.         boolean isNegative = false;// 是不是负数  
  62.         try {  
  63.             while ((read = reader.read()) != -1) {  
  64.                 if ((char) read == '-') {  
  65.                     res = 0;  
  66.                     isNegative = true;  
  67.                     break;  
  68.                 } else if (isNumber((char) read)) {  
  69.                     res = read - '0';  
  70.                     break;  
  71.                 }  
  72.             }  
  73.             while ((read = reader.read()) != -1) {  
  74.                 char ch = (char) read;  
  75.                 if (isNumber(ch)) {  
  76.                     res = res * 10 + (read - '0');  
  77.                 } else {  
  78.                     break;  
  79.                 }  
  80.             }  
  81.         } catch (IOException e) {  
  82.             // TODO Auto-generated catch block  
  83.             e.printStackTrace();  
  84.         }  
  85.         if (isNegative == true) {  
  86.             res = -1 * res;  
  87.         }  
  88.         return res;  
  89.     }  
  90.   
  91.     /** 
  92.      * 判断字符是否空白 
  93.      *  
  94.      * @param ch 
  95.      *            字符 
  96.      * @return 判断结果 
  97.      */  
  98.     public static boolean isBlank(char ch) {  
  99.         if (ch == '\r' || ch == '\n' || ch == ' ') {  
  100.             return true;  
  101.         }  
  102.         return false;  
  103.     }  
  104.   
  105.     /** 
  106.      * 判断字符是不是数字 
  107.      *  
  108.      * @param ch 
  109.      *            字符 
  110.      * @return 判断结果 
  111.      */  
  112.     public static boolean isNumber(char ch) {  
  113.         if (ch <= '9' && ch >= '0') {  
  114.             return true;  
  115.         }  
  116.         return false;  
  117.     }  
  118. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值