我在这个帖子中看到过这个问题的解决方案 - > 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};
我没有得到正确的重复元素。有人可以纠正我在这里犯的错误吗?
答案 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。