3

私は宿題のプログラミングの問題を割り当てられました、そして私は立ち止まっています。私は今日何時間も答えを見つけようとして検索しました、そしてそれはここで決して尋ねられなかったようです。基本的に、配列のモードの逆を見つける必要があります。これが私が解決策を見つけるために尋ねられた質問です:

LeastFrequent-System.inから入力された10個の整数のリストから、発生回数が最も少ない整数を出力します。リスト内の複数の整数の出現頻度が最も低い場合は、出現頻度の最も低い整数を出力します。クラスにLeastFrequentという名前を付けます。10個の整数はすべて-100から100までの範囲にあると想定できます。

これが私がこれまでに持っているコードです:

package leastfrequent;
import java.util.*;

public class LeastFrequent
{
    private static int[] arr = new int[10];
    private static int minValue;
    private static int minCount;

    public static void leastCommon()
    {
        for(int i = 0; i < arr.length; i++)
        {
            int count = 0;

            for(int j = 0; j < arr.length; j++)
            {
                if(arr[j] == arr[i]) 
                {
                    count++;
                }
            }

            if(count > minCount)
            {
                minCount = count;
                minValue = arr[i];
            }
        }
    }

    public static void main(String[] args)
    {
        Scanner stdin = new Scanner(System.in);
        System.out.print("numbers: ");

        for(int i = 0; i < arr.length; i++)
        {
            arr[i] = stdin.nextInt();
        }

        Arrays.sort(arr);
        leastCommon();

        System.out.println("least frequent: " + minValue + " occurs " + minCount + " times");
    }
}

基本的に、モードを見つけることができれば、そのアルゴリズムを逆にして最も一般的でないものを見つけることができると考えましたが、常にゼロを読み取るため、それは機能しません。

誰かアイデアはありますか?

助けてください!!

4

3 に答える 3

4

範囲が [-100,100] であるため、長さ 201 の補助配列を使用できます。

int[] counters = new int[201];

ユーザーが -59 を入力し、その特定のカウンターをインクリメントするとします。

counters[-59 + 100]++;

次に、counters 配列を反復処理し、最小のゼロ以外の要素を見つけます。その指数から 100 を引くと、それが確実に最も頻度の低い数になります。

int  min = Integer.MIN_VALUE;

for(int i: counters)
{
   if(i != 0 && i < min)
     min = i;
}

counters[i]これは、発生頻度が最も低いことを意味し(i-100) 、実際の値に対応します。

于 2012-11-29T04:09:16.750 に答える
3

ペンと紙でこれを行う方法を考えてみてください。

  1. 各数値が配列に出現する回数を数えます。
  2. 最小のカウントを見つけます。
  3. そのカウントに対応する値を返します。これは、そのカウントにマップされた値を何らかの形で保存することを要求します。

配列がソートされているという事実により、同じ数の連続する最短の実行を探すことで、このアルゴリズムを最適化できます。つまり、O(1)補助メモリを使用して、これを 1 回のパスで実行できます。

于 2012-11-29T04:08:50.300 に答える
3

2 つの変更:

  1. minCount最大のインデックス、つまり 10 で初期化します。

    private static int minCount = 10;
    
  2. asの代わりifに比較するように変更します。less thangreater than

    if(count < minCount){
    

このようにminCountして、発生回数が少なくなり、最終的に発生回数が少なくなるたびに、回数が少なくなるように変更します。

休みは大丈夫だと思います。これでプログラムが修正されることを願っています。

于 2012-11-29T04:19:18.483 に答える