一个只出现一次的元素
- 输入:
1 3 5 7 1 3 5
- 输出:
7
这里介绍采用异或的方法:
0^0=0
0^1=1
1^1=0
相同的数异或为0,任何数和0异或为这个数
我们可以利用这一点,异或整个数组,返回这一个元素
代码如下:
int Search(int arr[], int len){
int i, tmp = 0;
for (i = 0; i < len; i++){
tmp ^= arr[i];
}
return tmp;
}
两个只出现一次的元素
- 输入
1 3 5 1 3 9
- 输出
5 9
代码如下:
void Search1(int arr[], int len) {
int i = 0,j=0,result=0;
int pos = 0;
int t = 0;
for (i = 0; i < len;i++) {
result ^= arr[i];
}
//寻找第一次出现1的位置
for (pos = 0; pos < 32;pos++) {
if (((result >> pos) & 1) == 1) {
break;
}
}
//寻找数组中相同位置出现1的数,进行异或
for (j = 0; j < len;j++) {
if (((arr[j]>>pos)&1)==1) {
t ^= arr[j];
}
}
printf("%d %d\n",t , result^t);
}