/*
题目:
数组中除一个数字只出现一次外,其余数字都出现3次。
*/
/*
思路:
位运算。
*/
#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
int FindNumsAppearOnce(int data[],int length){
if(length < 1 || data == nullptr) return -1;
int intSize = sizeof(int)*8;
int bitSum[intSize] = {0};
//计算各位的1的个数
for(int i = 0; i < length; i++){
int bisMask = 0;
for(int j = intSize-1; j>= 0; j--){
bitSum[j] += ((data[i]>>bisMask) & 1);
bisMask++;
}
}
//各位上出现3的非整数倍,则该位属于只出现一次的数字
int bisMask = 0;
int res = 0;
for(int i = intSize-1; i >= 0; i--){
if(bitSum[i] % 3 == 1){
res += (1<<bisMask);
bisMask++;
}
}
return res;
}
int main(){
int data[] = {2,2,2,3,6,4,5,5,4,6,6,5,4,32,32,32};
cout<<FindNumsAppearOnce(data,sizeof(data)/sizeof(data[0]));
}