栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java Scanner输入优化

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    
    static void init(InputStream input) {
        reader = new BufferedReader(
                new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    }

    
    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 Reader {
    static BufferedReader reader;
    static StringTokenizer tokenizer;

    
    static void init(InputStream input) {
        reader = new BufferedReader(
                new InputStreamReader(input));
        tokenizer = new StringTokenizer("");
    }

    
    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,结果一查好家伙。果然没有经历实战开发是不行的!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/762883.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号