C 使用xor的数组中重复且缺失的数字
如何使用xor查找重复数和缺失数? 例如:C 使用xor的数组中重复且缺失的数字,c,arrays,algorithm,data-structures,C,Arrays,Algorithm,Data Structures,如何使用xor查找重复数和缺失数? 例如:actual=[1,2,3]input\u received=[3,2,3]。这里缺少的数字是1,重复的数字是3。我在冲浪时发现了一个很有趣的解决方案 int missing_and_repeating(int a[], int n, int size){ int xor =0; int i; int x =0 , y =0; for(i=0; i<size; i++) xor = xor^a[i];
actual=[1,2,3]
input\u received=[3,2,3]
。这里缺少的数字是1
,重复的数字是3
。我在冲浪时发现了一个很有趣的解决方案
int missing_and_repeating(int a[], int n, int size){
int xor =0;
int i;
int x =0 , y =0;
for(i=0; i<size; i++)
xor = xor^a[i];
for(i=1; i<=n; i++)
xor = xor^i;
// Get the rightmost bit which is set
int set_bit_no = xor & ~(xor -1);
// XOR numbers in two buckets
for(i=0; i<size; i++){
if(a[i]& set_bit_no){
x = x^a[i];
}
else
y = y^ a[i];
}
for(i=1; i<=n; i++){
if(i & set_bit_no)
x = x^i;
else
y = y^i;
}
printf("\n %d %d ", x,y );
}
int缺失和重复(int a[],int n,int size){
int-xor=0;
int i;
int x=0,y=0;
对于(i=0;i我假设前提条件是恰好一个数组元素丢失,而被另一个元素的副本替换。因此,actual={a1,a2,…,an}
和input_received={a2,a2,…,an}
(我们总是可以重新排列元素,以便a1
丢失并且a2
重复)
因此,当对两个数组中的所有元素进行异或运算时,会得到xored=a1^a2
现在我们必须分解这个数字才能知道a1
和a2
。你取一个非零位(不管是哪一个,最简单的方法是取最低有效位,就像在代码中一样,如果a1!=a2
,你总是有一个)。此位仅在数字a1
或a2
中的一个中设置。因此,对所有具有此位的数字进行异或,它们将相互湮灭,只留下a1
或a2
,然后对所有其他数字进行异或,因此结果将分别是另一个数字-a2
或a1
需要注意的是,该算法不会告诉这些数字中哪些丢失了,哪些重复了。下面的代码说明了这一点:
int main() {
int arr1[] = {1, 1};
missing_and_repeating(arr1, 2, 2);
int arr2[] = {2, 2};
missing_and_repeating(arr2, 2, 2);
}
输出:
1 2
1 2
如何返回结果,一个集合或数组,包含一个数组的元素,结果应该是数组的元素。在这个例子中,结果应该是1,这不是C++,<代码> XOR >代码>是一个保留的令牌。我真的没有得到“设置位”这个词。请解释一下。请用一个例子解释一下,这个拆分是如何在设置位的帮助下发生的。@user2112700我可以,但是你自己做会更有用。