Java Scanner输入优化

Posted Huterox

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java Scanner输入优化相关的知识,希望对你有一定的参考价值。

文章目录

前言

以前的老玩意,没发~

题目

这个没什么好说的,还要从一道蓝桥杯的题目来说。

资源限制

时间限制:1.0s 内存限制:256.0MB

问题描述

JOE有一个长度为n的数组A,已知其中至少有一半以上的元素相同,现在JOE想知道数组的众数。

输入格式

第一行,一个数n。
  第二行,n个正整数,表示A数组。

输出格式

一个数,表示这n个数的众数。

样例输入

5
1 1 2 1 2

样例输出

1

数据规模和约定

30% n <= 10^4,数值 <= 10^8
  60% n <= 10^7,数值 <= 10^6
  100% n <= 10^7,数值 <= 10^8

本来这题挺简单的,直接扫描即可的。


import java.io.BufferedInputStream;
import java.util.Scanner;

public class Main 
        public static void main( String[ ] args) 
        Scanner scanner = new Scanner(new BufferedInputStream(System.in));
        Long n = scanner.nextLong();
        Long res = 1L;
        int result = scanner.nextInt();
        for(Long i = 1L;i<=n&res<=n;i++)
            int temp = scanner.nextInt();
            if(res == 0) result = temp;
            res += temp == result?1:-1;
        
        System.out.println( result);
        



但是对不起,60分,10个测试案例只过了6个
原因很简单,那个scanner不行呀。

解决方案就是使用 Buffer
类似重新Scanner的方法。

这里的话我在一个竞赛网站找到了帮我封装好的类


import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;


/** Class for buffered reading int and double values */
class Reader 
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /**
     * call this method to initialize reader for InputStream
     */
    static void init(InputStream input) 
        reader = new BufferedReader(
                new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    

    /**
     * get next word
     */
    static String next() throws IOException 
        while (!tokenizer.hasMoreTokens()) 
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                    reader.readLine());
        
        return tokenizer.nextToken();
    

    static int nextInt() throws IOException 
        return Integer.parseInt(next());
    

    static double nextDouble() throws IOException 
        return Double.parseDouble(next());
    


问题解决

那么在题目里面是这样的


import java.io.*;
import java.util.Scanner;
import java.util.StringTokenizer;


/** Class for buffered reading int and double values */
class Reader 
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    /**
     * call this method to initialize reader for InputStream
     */
    static void init(InputStream input) 
        reader = new BufferedReader(
                new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    

    /**
     * get next word
     */
    static String next() throws IOException 
        while (!tokenizer.hasMoreTokens()) 
            //TODO add check for eof if necessary
            tokenizer = new StringTokenizer(
                    reader.readLine());
        
        return tokenizer.nextToken();
    

    static int nextInt() throws IOException 
        return Integer.parseInt(next());
    

    static double nextDouble() throws IOException 
        return Double.parseDouble(next());
    

public class Main 
        public static void main( String[ ] args) throws IOException 
        Reader.init(System.in);
        int n = Reader.nextInt();
        int res = 1;
        int result = Reader.nextInt();
        for(int i = 1;i<=n&res<=n;i++)
            int temp = Reader.nextInt();
            if(res == 0) result = temp;
            res += temp == result?1:-1;
        
        System.out.println( result);
        



就是这样的,问题解决,搞了半天是java的 scanner不行!我找了半天资料,看别人的解法,可是想来想去都不可能是算法的问题(我还尝试了多线程方案,反而更不行,超内存,还要锁)而且无论如何其实发现都要读取百万次,所以就想是不是别人的问题比如scanner,结果一查好家伙。果然没有经历实战开发是不行的!

以上是关于Java Scanner输入优化的主要内容,如果未能解决你的问题,请参考以下文章

二元一次方程组简单解法(输入样式有介绍)

java中如何使用scanner来实现数据的输入?

java 优化版 用接口实现(输入两个数选择实现加减乘除运算)

关于java scanner类简化输入的一点疑问

java中怎么用scanner

Java-Scanner输入