3

ある数値が 50 個の数値の配列に複数回出現するかどうかを調べるプログラムを作成する必要があります。

私は50個の乱数を生成する配列を持っていますが、ループを書いて同じものがいくつあるかを確認するために頭を悩ませているようです..

4

2 に答える 2

1

次のコードは、ロールされた各数字をカウントし、カウントをnumbersマップに格納します。

Map<Integer, Integer> numbers = new HashMap<Integer, Integer>();
for (int i = 0; i < 50; i++) {
    Integer num = die.roll();
    Integer count = numbers.get(num);
    if (count == null) {
        count = Integer.valueOf(0);
    }
    count = Integer.valueOf(count.intValue() + 1);
    numbers.put(num, count);
}

次に、すべてのマップ エントリをチェックして、複数回ロールされたエントリを見つけることができます。

for (Map.Entry<Integer, Integer> entry : numbers.entrySet()) {
    if (entry.getValue().intValue() > 1) {
        System.out.println(entry.getKey() + " rolled more than once");
    }
}

または、最初のループで条件を変更して、そこに数値を出力することもできます。

for (int i = 0; i < 50; i++) {
    Integer num = die.roll();
    Integer count = numbers.get(num);
    if (count != null) {
        System.out.println(num + " rolled more than once");
    } else {
        numbers.put(num, Integer.valueOf(1));
    }
}

最後に、配列を使用してその中の数値を見つけることができます。

for (int i = 0; i < 50; i++) {
    nums[i] = die.roll();
    for (int j = i - 1; j >= 0; j--) {
        if (nums[i] == nums[j]) {
            System.out.println(nums[i] + " rolled more than once");
            break;
        }
    }
}
于 2012-11-29T16:40:09.563 に答える
0

データの並べ替えを試すことができます

int[] nums = new int[50];
for(int i = 0; i < nums.length; i++) nums[i] = die.roll();
java.util.Arrays.sort(nums);
int dupes = 0;
for(int i = 0; i < nums.length - 1; i++) {
    if(nums[i] == nums[i+1) dupes++;
}

データを並べ替えると、すべての等しい要素が隣り合わせに配置されるため、1 回のパスでそれらを見つけることができます。もちろん、並べ替える必要がありますが、これは 1 回の操作ではありません。

これにより、マップを使用するオーバーヘッドがなくなり、それでも非常に高速です。並べ替えは です。これは、マップを使用するソリューションn lg nよりも遅くなりますが、このように小さい場合、マップのオーバーヘッドが大きくなる可能性があります。コード自体も従うのが非常に簡単です。nn

10 要素の配列で 0 ~ 19 の数字を使用するこの自己完結型の例を参照してください (簡単に確認できるように数字を縮小しています。概念は完全に適用されます)。

import java.util.*;
class Christine {
    static Random random = new Random();
    static int dieroll() {
        return random.nextInt(20);
    }
    public static void main(String[] args) {
        int[] nums = new int[10];
        for(int i = 0; i < nums.length; i++) nums[i] = dieroll();
        System.out.println(Arrays.toString(nums));
        Arrays.sort(nums);
        int dupes = 0;
        for(int i = 0; i < nums.length - 1; i++) {
            if(nums[i] == nums[i+1]) dupes++;
        }
        System.out.println(dupes);
    }


}

次のように例を実行します。

c:\files\j>javac Christine.java

c:\files\j>java Christine
[2, 9, 8, 5, 11, 12, 15, 15, 16, 7]
1

c:\files\j>java Christine
[10, 10, 1, 18, 11, 6, 4, 3, 9, 5]
1

c:\files\j>java Christine
[8, 0, 13, 4, 5, 4, 16, 13, 6, 18]
2

最初の実行では、2 つの 15 があります。2 番目には、2 つの 10 があります。3 番目には、2 つの 13 と 2 つの 4 があります。

次の例を検討してください。

c:\files\j>java Christine
[17, 19, 19, 3, 19, 4, 18, 19, 1, 1]
4

これは、4 つの異なる 19 に対して 3 つの重複をカウントし、2 つの 1 に対して 1 つの重複をカウントします。では、なぜ 19 年代に 3 つのだまされているのですか? 19 を a、b、c、d と呼ぶと、a は b をだまされたと見なし、b は c をだましと見なし、c は d をだましと見なすからです。だから3つあります。そのための6つの重複すべてをキャッチするために、より堅牢にするために追加のロジックを追加する必要があります。

于 2012-11-29T17:03:51.843 に答える