JAVA处理IO有两套标准
1.字节流
2.字符流
牛客.dd爱框框
快速输入的代码
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Read { //字符串裁剪 StringTokenizer st=new StringTokenizer(""); //1.把字节流转化为字符流 从IO设备中拿数据,先是建立一个内存缓冲区,然后以后都从他的内存缓冲区拿数据, BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); // 再从从内存缓冲区里面拿数据 String next()throws IOException{ //看他后面还有没有要裁切的数据 while(!st.hasMoreTokens()){ //bf.nextLine:直接在内存缓存区里面,拿一行数据,交给这个字符串裁切对象 st=new StringTokenizer(bf.readLine()); } //再返回新读入这一行 return st.nextToken(); } String nextLine() throws IOException { return bf.readLine(); } int nextInt() throws IOException { return Integer.parseInt(next()); } long nextLong() throws IOException { return Long.parseLong(next()); } double nextDouble() throws IOException { return Double.parseDouble(next()); } }
快速输入输出快的原因
我开始真的是不清楚,这种输入输出有啥用,也没有人给我讲讲,它的原理是什么
直到,有些事情,自己经历过就清楚什么用,我就再想我的代码有啥问题,自己检查半天也不清楚啥问题,以为有奇怪的吊炸天的例子,直到我看到题解里面快速输出。我去尝试,发现确实是这样
Scanner与System.out,这两个都是他们区访问IO设备,每次输入输出都会访问IO设备
那么BufferedReader起到作用的是什么呢
next()的意思
如何快速读入呢(在这里,使用的是)
public static PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
这里其实bufferedWriter,就已经足够,但是使用这个PrintWriter,我们可以像是之前一样,使用println之类的,换句话学习成本低。
AC代码
import java.util.*; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main{ public static void main(String[]args) throws IOException{ Read scanner=new Read(); int a1=scanner.nextInt(); int b1=scanner.nextInt(); int []a=new int[a1]; for(int i=0;i<a1;i++){ a[i]=scanner.nextInt(); } int left=0; int right=0; int count=0; int []sum=new int[2]; sum[0]=Integer.MAX_VALUE; sum[1]=Integer.MAX_VALUE; int ret=Integer.MAX_VALUE; while(right<a1&&left<=right) { if (count < b1) count += a[right]; while (count >= b1&&left<=right) { if (right - left + 1 <= ret && count >= b1) { if (right - left + 1 == ret) { sum[0] = Math.min(left + 1, sum[0]); sum[1] = Math.min(right + 1, sum[1]); } else { sum[0] = left + 1; sum[1] = right + 1; ret = Math.min(right - left + 1, ret); } } count -= a[left]; left++; } right++; } System.out.print(sum[0]+" "+sum[1]); } } class Read { //字符串裁剪 StringTokenizer st=new StringTokenizer(""); //1.把字节流转化为字符流 从IO设备中拿数据,先是建立一个内存缓冲区,然后以后都从他的内存缓冲区拿数据, BufferedReader bf=new BufferedReader(new InputStreamReader(System.in)); // 再从从内存缓冲区里面拿数据 String next()throws IOException{ //看他后面还有没有要裁切的数据 while(!st.hasMoreTokens()){ //bf.nextLine:直接在内存缓存区里面,拿一行数据,交给这个字符串裁切对象 st=new StringTokenizer(bf.readLine()); } //再返回新读入这一行 return st.nextToken(); } String nextLine() throws IOException { return bf.readLine(); } int nextInt() throws IOException { return Integer.parseInt(next()); } long nextLong() throws IOException { return Long.parseLong(next()); } double nextDouble() throws IOException { return Double.parseDouble(next()); } }