最近发现这样一道题,大致意思是给定一个数组,其中元素仅有一个只出现一次,其余元素均出现两次,编写程序以找出这个数。

这里可以用到异或运算。

异或运算法则如下:

  1. 交换律:A ^ B = B ^ A

  2. 结合律:A ^ (B ^ C) = (A ^ B) ^ C

  3. 恒等律:X ^ 0 = X

  4. 归零律:X ^ X = 0

  5. 自反:A ^ B ^ B = A ^ 0 = A

    这里主要用到后三条性质,可以定义变量key,不断与数组元素进行异或运算,某种意义上达到对于数组的压缩储存。

代码实现如下:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int func(int *array,int num){
int key=0;
for(int i=0;i<num;i++){
key^=array[i];
}
return key;
}
int main(){
int array[]={1,2,4,6,2,1,4,7,8,9,8,7,9};
printf("%d",func(array,13));
}