/* 题目: 数组中除一个数字只出现一次外,其余数字都出现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])); }