序文
この記事は、アルゴリズムをブラッシングするときにタイムアウトの問題を解決した経験です. 少しの洞察は無視できます. 読んでくれてありがとう
問題のシナリオ
コードのアルゴリズム戦略とデータ構造の観点からコードを最適化できない場合、または他の言語 (C、C++ など) では同じ方法で問題を解決できるが、Java がタイムアウトになる場合、問題は Java の取得にある可能性があります。優れた出力データのデータと最終処理
データ入力レベル
具体的な紹介
たとえば、トピックに大量のデータ入力がある場合、明らかに Scanner や BufferedReader を使用するだけでは不十分です。StreamTokenizer を試すことができます。大量のデータの入力と取得については、Scanner や BufferedReader よりもはるかに効率的です。
java.io.StreamTokenizer クラスは、入力ストリームを受け取り、それを「トークン」に解析して、トークンを一度に 1 つずつ読み取ることができるようにします。ストリーム トークナイザーは、識別子、数字、引用符で囲まれた文字列、およびさまざまなコメント スタイルを認識します。大量のデータの入力と取得には BufferedReader よりも効率的です
コードでの初期化は次のとおりです。
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
一般的な方法
一般的に使用される方法は次のとおりです。
double nval
- 現在のトークンが数値の場合、このフィールドにはその数値の値が含まれます
int nextToken()
- このメソッドは、トークナイザーの入力ストリームから次のトークンを解析します。
StreamTokenizer でデータを取得するための 2 つのセットは、nextToken() と (int)sc.nval です。
注:これnval間違えないように、前に navl と書いたのですが、長い間検索しても問題が見つかりませんでした、血と涙から学んだ教訓
//声明StreamTokenizer
StreamTokenizer sc = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
//先获取下一个数
sc.nextToken();
//把获取的数字给转换为int型
int num = (int)sc.nval;
データ出力レベル
具体的な紹介
同様に、大量のコンソール出力の場合、System.out.println も比較的弱く、効率は printwriter よりもはるかに低くなります。
最初に、共通の System.out.println について説明しましょう。これはクラス PrintStream オブジェクトへの参照であり、コンソールの出力は print() および println() メソッドによって定義されます。
PrintStream は OutputStream のサブクラスであり、 PrintWriter は Writer のサブクラスです。どちらも対等な立場です。
ただし、1 つはバイト印刷ストリームで、もう 1 つは文字印刷ストリームです。
1文字(char)が16bit、1バイト(byte)が8bit、PrintStreamは8bitデータの文字列を書き込むものです。PrintWriter は、16 ビット データの文字列を書き込むことです。
文字印刷の場合は、PrintWriter クラスの方が適しています.
PrintStream によって出力されるすべての文字は、デフォルトの文字エンコーディングを使用してバイトに変換されます. バイトではなく文字を書き込む必要がある場合は、PrintWriter クラスを使用する必要があります。
一般的な方法
文字ストリーム PrintWriter は、バイトではなく文字で書き込むことを除いて、PrintStream に似ています。PrintWriter は、print()、println()、printf()、および format() のすべての便利な印刷メソッドもサポートしています。IOException をスローしません
PrintWriter out = new PrintWriter(System.out);
out.println();
out.flush();
out.close();