题目:
一个数组中只有两个数字是出现一次,其他所有数字都出现了两次。 找出这两个数字,编程实现。
思路:
在前面我们遇到过在一个数组中只有一个数字出现一次,找出这个数字是用的异或来完成的,现在要找其中两个只出现一次的数字,方法还是一样,只是异或得到的结果是那两个数字异或后的值,应该怎么处理拿出来这两个数字呢。
1、将数组中所有的数字异或,得到两个只出现一次的两个数字异或的结果。
2、将得到的这个数字与1进行与运算,得到第一次出现1的位置。
3、根据这个位置是否为1,将数组中所有元素分为两组,分别进行异或运算,即可得到要求的两个数字了。
实现代码:
#include<stdio.h>
#include<stdlib.h>
int Find_num(int arr[], int size) {
int ret = 0;//用来存放整个数组元素异或后的值
int sign = 0;//标记ret结果中第一个为1的位置
int x = 0;
int y = 0;//x,y为所求数组中只出现一次的两个数
for (int i = 0; i < size; ++i) {
ret ^= arr[i];
}
for (int i = 0; i < 32; ++i) {
if (ret&(1 << i) == 1) {
sign = i;//sign即为ret中第一个为1的位置
break;
}
}
for (int i = 0; i < size; ++i) {
if (arr[i] & (1 << sign) == 1) {
x ^= arr[i]; //用x y将数组中元素分为两组,再进行异或运算
}
else {
y ^= arr[i];
}
}
printf("%d,%d\n", x, y);
}
int main() {
int arr[] = { 2,7,4,1,7,5,2,1,5,9 };
int size = sizeof(arr) / sizeof(arr[0]);
Find_num(arr, size);
system("pause");
return 0;
}
运行结果: