2012-04-12 5 views
1

可能性の重複:奇数サイズの整数の配列を考えると
Find integer not occurring twice in an array
Accenture interview question - find the only unpaired element in the array配列内の結合されていない整数を見つける方法は?

。配列内のすべての整数は、単一の整数を除いて2回表示されます。最も効率的な(メモリと複雑さの両方の)方法で、この結合されていない整数を見つける方法はありますか?

答えて

14

これらをすべてXORすると、孤立した(結合されていない)値になります。

x XOR xはすべてx値に対してゼロであり、0 XOR xxあるためです。例として

、次のプログラム出力99

効率の観点から
#include <stdio.h> 
int main (void) { 
    int num[] = { 1, 2, 3, 4, 5, 99, 1, 2, 3, 4, 5}; 
    unsigned int i; 
    int accum; 

    for (accum = 0, i = 0; i < sizeof(num)/sizeof(*num); i++) 
     accum ^= num[i]; 

    printf ("%d\n", accum); 

    return 0; 
} 

、それは基本的にO(1)空間とO(n)の時間計算量、最小、平均および最悪のケースです。

+0

数字がゼロの場合はどうなりますか? –

+0

@Guarav、期待どおりにゼロになるでしょう。それを試してみてください。上記のコードで99を変更してください:-) – paxdiablo

+0

ええ、それはちょうどそれを実行しました。ありがとう:) ... +1 –

1

paxが示唆しているように、すべての要素を一緒にXORすると、あなたの唯一の価値が得られます。

int getUncoupled(int *values, int len) 
{ 
    int uncoupled = 0; 
    for(int i = 0; i < len; i++) 
     uncoupled ^= values[i]; 
    return uncoupled; 
} 

しかし、ここで若干の注意点がある:なし切り離さ値とそのカップリングしていない値がゼロであるセットの違いは何ですか? x^x^y^y = 0しかし、x^x^0^y^yもゼロに等しいか?思考のための食べ物:

+1

出力には違いはありませんが、「奇数サイズ」と「配列内のすべての整数は1つの整数を除いて2回現れます」とすると、x^x^y^y '不可能です。 – paxdiablo

+0

私の間違いは、配列が奇数サイズでない場合にはもっと意味があります。それが質問の制約だとすれば、私はそれが無関係であることを指摘していると思います。 –

関連する問題