0

私は配列を持っています、scores[5][5]そしてそれはテストスコアで満たされています。

最も頻繁に発生するスコアを見つけて返す必要があります。

4

5 に答える 5

2

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 番目はマップ全体を実行し、カウントが最大の値のリストを作成します。

于 2010-04-30T01:05:30.567 に答える
1

2 つの部分があります。スコアの反復と、各スコアの頻度の保存です。どちらも配列/配列リストの使用を伴います。さらにサポートが必要な場合は、直接質問することができます。:D

于 2010-04-30T00:52:14.060 に答える
0

スコアは境界のある範囲 (例: 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]);
于 2010-04-30T01:42:35.537 に答える
0

または、現在の最大のものへのポインターを保持します。作成または更新するたびに、以前の最大値を超えたかどうかを比較し、超えている場合は置き換えます。ハッシュマップを介して別のパスを保存します。

于 2010-04-30T01:44:24.073 に答える
0

このようなことについては、実際にどのように行うかをモデル化したコードを記述してください。

モデル化しましょう:

[5][5] 配列: 5 列 5 行の数字のグリッドです。

0,0 の位置から開始 - その位置の値を読み取り、リスト (Java では ArrayList または HashMap) を開始し、リストに番号を追加してハッシュ マーク (値 1) を付けて、ユーザーであることを示します。一度見たことがある。

列を横切ってから、左に戻って列を下ります。

あなたが読んだ各番号は、それがすでにあなたのリストにあるかどうかを確認してください. そうである場合は、別のハッシュ マークを作成します (1 を追加します)。そうでない場合は、番号をリストに追加し、ハッシュ マークを付けます。

配列の読み取りが完了したら、リストを最初から見て、指をその上に置いて、見たハッシュ マークの数が最も多い数を追跡します (数を変数に格納します)。

その最後の変数を返します。

于 2010-04-30T03:55:41.553 に答える