Javaスキャナー入力の最適化

記事ディレクトリ

序文

以前の古いものは投稿しませんでした〜

トピック

これは言うまでもありませんが、ブルーブリッジカップのトピックからもです。

リソースの制約

制限時間:1.0秒メモリ制限:256.0MB

問題の説明

JOEには長さnの配列Aがあり、要素の少なくとも半分が同じであることがわかっています。ここで、JOEは配列のモードを知りたいと考えています。

入力フォーマット

最初の行、数値n。
  2行目の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つだけです。
理由は非常に単純で、スキャナーは良くありません。

解決策は、バッファーの
ような再スキャナーアプローチを使用することです。

この場合、私は競争のウェブサイトで私のためのパッケージ化されたクラスを見つけました


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のスキャナーは動作しません!私は長い間情報を検索して他の人の解決策を調べましたが、それを考えた後、それはアルゴリズムの問​​題ではありませんでした(マルチスレッドの解決策も試しましたが、さらに悪いことに、メモリ過剰、でもロックされていて)とにかく、実際に読まなくてはいけないことに気づき、何百万回もかかったので、スキャナーなど他人の問題なのかと思って、いいやつになりました。案の定、実際の戦闘経験なしに開発することは不可能です!

おすすめ

転載: blog.csdn.net/FUTEROX/article/details/123483699