输入数据 : ar[] = {7,7,7,3,5,4,5,3,4,3,5,4,11};
输出数据 : res = 11
#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
int findSingle(int arr[], int len)
{
int res = 0;
int x, sum, i;
for (i = 0; i < sizeof(int) * 8; i++) {
sum = 0;
x = (1 << i);
int j = 0;
for (j = 0; j < len; j++) {
if (arr[j] & x)
sum++;
}
if (sum % 3) {
res |= x;
}
}
return res;
}
int main(int argc, char *argv[])
{
int ar[] = {7,7,7,3,5,4,5,3,4,3,5,4,11};
int len = sizeof(ar) / sizeof(ar[0]);
int res = findSingle(ar, len);
printf("res = %d\n", res);
return 0;
}
输出结果:
res = 11
原理说明:
对于数组 a[] = {5, 5, 5} 转化每个数为二进制形式:
0 1 0 1
0 1 0 1
0 1 0 1
第 一 bit 位 (1 +1 +1) % 3 = 0
第 二 bit 位 (0 + 0 + 0) % 3 = 0
第 三 bit 位 (1 +1 +1) % 3 = 0
第 四 bit 位 (0 + 0 + 0) % 3 = 0
不难发现 ,如果 一个数出现了 三次 那么 对应的 二进制位上面的 1 的个数必然 是 3 的倍数个
当数组变成 a[] = {5,5,5,6} 转化每个数为二进制形式:
0 1 0 1
0 1 0 1
0 1 0 1
0 1 1 0
第 一 bit 位 (1 +1 +1 + 0) % 3 = 0
第 二 bit 位 (0 + 0 + 0 + 1) % 3 = 1
第 三 bit 位 (1 +1 +1 + 1) % 3 = 1
第 四 bit 位 (0 + 0 + 0 + 0) % 3 = 0
结果为 : 0110 转为 10 进制 结果为 6