0

n個の整数があり、それらがすべて異なることを確認するために簡単なロジックテストが必要です。すべての組み合わせを比較して一致を見つけたくありません...素敵でエレガントなアプローチに関するアイデアはありますか?

あなたのアイデアがどのプログラミング言語で書かれているかは気にしません。変換できます!

4

3 に答える 3

7

言語がサポートしている場合は、セット データ構造を使用します。また、表示された要素のハッシュ テーブルを保持することも検討できます。

pythonでは、試してみてください

seen={}
n_already_seen=n in seen
seen[n]=n

n_already_seenn がすでに見られているかどうかを示すブール値になります。

于 2012-07-03T22:06:36.690 に答える
2

可換性と推移性のおかげで、すべての組み合わせをチェックする必要はありません。リストを下に移動して、各エントリをその後に続く各エントリと照合するだけです。例えば:

bool areElementsUnique( int[] arr ) {
    for( int i=0; i<arr.Length-1; i++ ) {
        for( int j=i+1; j<arr.Length; j++ ) {
            if( arr[i] == arr[j] ) return false;
        }
    }
    return true;
}

内側のループは最初からではなく、次の要素(i+1)から始まることに注意してください。

于 2012-07-03T22:24:55.093 に答える
2

ハッシュ テーブルまたはハッシュを使用するセット型のデータ構造を使用できます。次に、すべての要素をハッシュテーブルまたはハッシュセットに挿入し、挿入時に、要素がテーブル/セットに既にあるかどうかを確認できます。何らかの理由で途中でチェックしたくない場合は、すべての数値を挿入してから、構造体のサイズが n 未満かどうかを確認できます。n 未満の場合は、繰り返し要素が必要です。そうでなければ、それらはすべてユニークでした。

これは、非常にコンパクトな Java ソリューションです。時間の複雑さは O(n) で償却され、空間の複雑さも O(n) です。

public boolean areAllElementsUnique(int [] list)
{
    Set<Integer> set = new HashSet<Integer>();
    for (int number: list)
        if (set.contains(number))
            return false;
        else
            set.add(number);
    return true;
}
于 2012-07-03T23:33:58.333 に答える