2

たとえば、配列内の個別/一意の値の数をどのように返しますか

int[] a = {1,2,2,4,5,5};
4

4 に答える 4

13
Set<Integer> s = new HashSet<Integer>();
for (int i : a) s.add(i);
int distinctCount = s.size();
于 2009-09-26T21:43:02.540 に答える
4

セットには、それぞれの一意の(.equals()で定義されている)要素が1回だけ格納されます。これを使用すると、問題を単純化できます。セットを作成し(私はHashSetを使用します)、配列を反復処理し、各整数をセットに追加してから、セットの.size()を返します。

于 2009-09-26T21:42:20.900 に答える
3

効率的な方法:配列を。で並べ替えArrays.sortます。隣接する等しい値をカウントアップするための単純なループを記述します。

于 2009-09-26T21:45:05.860 に答える
2

本当に配列内の要素の数に依存します。大量の整数を扱っていない場合は、HashSet またはバイナリ ツリーがおそらく最善の方法です。一方、多様な整数 (たとえば、10 億以上) の大きな配列がある場合は、各ビットが存在または非存在を表す 2^32 / 2^8 = 512 MByte バイト配列を割り当てることが理にかなっています。 -整数の存在を確認し、最後に設定されたビットの数を数えます。

バイナリ ツリー アプローチは n * log n 時間かかりますが、配列アプローチは n 時間かかります。また、バイナリ ツリーにはノードごとに 2 つのポインターが必要なため、メモリ使用量も大幅に増加します。同様の考慮事項がハッシュ テーブルにも適用されます。

もちろん、セットが小さい場合は、組み込みの HashSet を使用してください。

于 2009-09-26T21:58:18.877 に答える