私は配列を持っています、scores[5][5]
そしてそれはテストスコアで満たされています。
最も頻繁に発生するスコアを見つけて返す必要があります。
HashMap<Integer,Integer>
最初の整数がスコア配列の値で、2 番目の整数が頻度であるを作成するだけです。
次に、ハッシュマップを埋める配列を処理します。キーがすでに存在する場合は、カウントを 1 つ増やします。新しいキーの場合は、1 に設定します。
次に、ハッシュマップを処理して、出現回数が最大の値を見つけます。
Java がインストールされているマシンにアクセスできるようになったら、ソース コードに取り掛かるつもりでしたが、現在は宿題としてマークされているため、それはアルゴリズムのみです (いずれにせよ長期的にはあなたにとってより良いでしょう):
Create empty hashmap freq
For each entry in your array (probably nested loops):
If entry.value is not in freq:
Add entry.value to freq, set its count to zero
Increase count of freq.value
Set max_count to 0
For each item in freq:
If item.count is greater than max_count:
Set max_list to an empty list
Set max_count to item.count
If item.count is equal to max_count:
Append item.value to max_list
If max_count is greater than 0:
Output max_count, max_list
これは、2 つの連続したループで構成される、私が従う基本的なアルゴリズムです。
1 つ目は、後で最大のカウントを見つけることができるように、単純にカウントへの値のマッピングを作成します。
2 番目はマップ全体を実行し、カウントが最大の値のリストを作成します。
2 つの部分があります。スコアの反復と、各スコアの頻度の保存です。どちらも配列/配列リストの使用を伴います。さらにサポートが必要な場合は、直接質問することができます。:D
スコアは境界のある範囲 (例: 0..100
) にある可能性が高いため、カウント配列を使用してこれをすばやく行うことができます。基本的に、 sort をカウントする最初のフェーズを実行しています。
すべてのcount
可能なスコアの は から始まり、0
スコアごとs
に がインクリメントされますcount[s]
。すべてのスコアが処理されたら、 をスキャンして、どれが最も高いcount
かを確認しcount[k]
ます。
カウントを行っているときに、最も頻繁なスコアを追跡することもできます。次のようなことをしてください:
// init
mostFrequent = 0;
// during increment
count[s]++;
if (count[s] > count[mostFrequent]) {
mostFrequent = s;
}
スコアは 2 次元マトリックスに配置されているため (何らかの理由で?)、次のように各スコアを処理できます。
int[] count = new int[RANGE]; // valid scores are 0..RANGE-1
mostFrequent = 0;
for (int[] tuplet : scores) {
for (int s : tuplet) {
count[s]++;
if (count[s] > count[mostFrequent]) {
mostFrequent = s;
}
}
}
report(mostFrequent, count[mostFrequent]);
または、現在の最大のものへのポインターを保持します。作成または更新するたびに、以前の最大値を超えたかどうかを比較し、超えている場合は置き換えます。ハッシュマップを介して別のパスを保存します。
このようなことについては、実際にどのように行うかをモデル化したコードを記述してください。
モデル化しましょう:
[5][5] 配列: 5 列 5 行の数字のグリッドです。
0,0 の位置から開始 - その位置の値を読み取り、リスト (Java では ArrayList または HashMap) を開始し、リストに番号を追加してハッシュ マーク (値 1) を付けて、ユーザーであることを示します。一度見たことがある。
列を横切ってから、左に戻って列を下ります。
あなたが読んだ各番号は、それがすでにあなたのリストにあるかどうかを確認してください. そうである場合は、別のハッシュ マークを作成します (1 を追加します)。そうでない場合は、番号をリストに追加し、ハッシュ マークを付けます。
配列の読み取りが完了したら、リストを最初から見て、指をその上に置いて、見たハッシュ マークの数が最も多い数を追跡します (数を変数に格納します)。
その最後の変数を返します。