1.题目要求:找出两个各只出现一次的数字
- 例如 : 一个数组 arr[10] = { 1, 2, 2, 4, 4, 3, 3, 1, 8, 9 };
- 其中8和9只出现了一次,其余数字各出现了两次,找出8,9
- 首先明确两个 相同 的数字进行异或之后,结果为 0
- 任何数与 0 异或都等于它本身
步骤
- 写一个对数组进行异或的函数
- 然后先对 arr[10] 进行异或
- 然后异或得到的结果相当于8^9的结果,记作: ret = 8 ^ 9
- 找出二进制下 ret 为 1 的偏移量,记为 i
- 然后对 arr[10] 中的数字右移 i 位 与 1 按位与之后,根据结果的不同分成两部分
- 最后对这两个数组分别异或,得到结果
代码如下
//对数组进行异或的函数
int DiffOr(int arr[], int len){//负责异或一个数组
int ret = 0;
int i = 0;
for (i = 0; i < len; i++){
ret ^= arr[i];
}
return ret;
}
void FindNum(int arr[], int len){
int arr1[10] = { 0 };
int arr2[10] = { 0 };
int i = 0;
int ret = DiffOr(arr, len);//先对 arr[10] 进行异或
while (((ret >> i) & 1) != 1){//找出 ret 在二进制下为 1 时的偏移量
i++;
}
int j = 0;
for (j = 0; j < len; j++){//遍历arr数组,根据与第 i 位与 1 按位与的结果,分成两波
if (((arr[j] >> i) & 1) == 1){
arr1[j] = arr[j];
}
else{
arr2[j] = arr[j];
}
}
printf("%d\n",DiffOr(arr1,len));//对这两个数组分别异或
printf("%d\n", DiffOr(arr2,len));
}
int main () {
int arr[10] = { 1, 2, 2, 4, 4, 3, 3, 1, 8, 9 };
int len = sizeof(arr) / sizeof(arr[0]);
FindNum(arr,len);
return 0;
}