XOR以在数组中查找重复项

时间:2011-11-05 03:55:24

标签: c++ algorithm xor

我在这个帖子中看到过这个问题的解决方案 - > How to find a duplicate element in an array of shuffled consecutive integers?

但我现在遇到的问题与此有所不同。

int arr[10] = {1,2,3,4,5,6,7,8,4,9};
    int a= 0;
    for(int i=0;i<10;i++) {
     a= a^ arr[i] ^i;
    }
    cout<<a;

考虑上面提到的代码片段。事情很好。但是当我向上面提到的数组添加0时,int arr[11] = {0,1,2,3,4,5,6,7,8,4,9};我没有得到正确的重复元素。有人可以纠正我在这里犯的错误吗?

3 个答案:

答案 0 :(得分:3)

技巧依赖于介于1和n之间的值。如果数字在某个其他范围内,则必须抵消它们。

static const int n = 11;
int arr[n] = {0,1,2,3,4,5,6,7,8,4,9};
int offset = 1;
int a= 0;
for(int i=0;i<n;i++) {
 a= a^ (arr[i]+offset) ^i;
}
cout<< (a-offset);

答案 1 :(得分:1)

我猜这可能与i值与arr [i]

相同的事实有关

那就像在做:

  

00000001 ^ 00000001

等于00000000

我可能会错误地思考但不会搞砸这个过程吗?

答案 2 :(得分:0)

我想我知道发生了什么。你可能把循环改为

for(int i=0; i<11; i++)
  ...

因为你在循环中添加了一个额外的元素。问题是它不是XORing 10,这不是你的数组中的数字。因此,算法停止工作。

int arr[11] = {0,1,2,3,4,5,6,7,8,4,9};
int a= 0;
for(int i=0;i<10;i++) {
  a= a^ arr[i] ^i;
}
a = a^arr[10];

cout<<a;

现在,它的XORing从0到9两次(等于零)和另外4次,因此结果应为4。