Scanner与System.out为什么慢,快速输入输出模版,目录牛客.dd爱框框快速输入的代码快速输入输出快的原因 AC代码

简介: Scanner与System.out为什么慢,快速输入输出模版,目录牛客.dd爱框框快速输入的代码快速输入输出快的原因 AC代码

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());
    }
}


相关文章
用c语言输出有颜色的字体 printf输出 控制台程序修改文本位置 设置控制台程序窗口标题
用c语言输出有颜色的字体 printf输出 控制台程序修改文本位置 设置控制台程序窗口标题
|
数据安全/隐私保护 Windows
初次汇编语言编写程序输出HELLO,WORLD!
初次汇编语言编写程序输出HELLO,WORLD!
163 0
初次汇编语言编写程序输出HELLO,WORLD!
输入一个整形数(最多可以到亿位),然后按汉语的习惯,将其读出来并输出。如1052,读作:一千零五十二。 程序运行示例: 1052 一千零五十二
输入一个整形数(最多可以到亿位),然后按汉语的习惯,将其读出来并输出。如1052,读作:一千零五十二。 程序运行示例: 1052 一千零五十二
190 0
|
缓存 移动开发 编译器
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
C++STL开发温习与总结(六): 6.C++语言输入/输出流定义之输入/输出格式控制
|
编解码 Windows
Win系统 - 如何实现N卡四屏复制输出呢?
Win系统 - 如何实现N卡四屏复制输出呢?
245 0
Win系统 - 如何实现N卡四屏复制输出呢?
|
Java
编写Java程序,判断输入的三条长度的边,是否能构成三角形
编写Java程序,判断输入的三条长度的边,是否能构成三角形
294 0
编写Java程序,判断输入的三条长度的边,是否能构成三角形
|
Java
编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示
编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示
509 0
编写Java程序,实现从控制台输入对应个数的整数,输出对输入整数的从大到小显示
|
Java
编写Java程序_输入三个整数x,y,z,请把这三个数由小到大输出,请写出实现代码。(3种方法)
编写Java程序_输入三个整数x,y,z,请把这三个数由小到大输出,请写出实现代码。(3种方法)
773 0
编写Java程序_输入三个整数x,y,z,请把这三个数由小到大输出,请写出实现代码。(3种方法)
|
Python
【PYTHON实战】从键盘输入一些字符,逐个把它们写到磁盘文件上,直到输入一个 # 为止。
【PYTHON实战】从键盘输入一些字符,逐个把它们写到磁盘文件上,直到输入一个 # 为止。
1554 0
|
C++ Python
一分钟学Python| 变量与输入和输出
一分钟学Python| 变量与输入和输出
234 0
一分钟学Python| 变量与输入和输出