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