剑指offer——04二维数组中的查找
题目:
数组中唯一只出现一次的数字。
在一个数组中除一个数字只出现一次之外,其他数字都出现了三次。
请找出那个只出现一次的数字。
题解:
如果一个数字出现三次,那么它的二进制表示的每一位(0或者1)也出现三次。如果把所有出现三次的数字的二进制表示的每一位都分别加起来,那么每一位的和都能被3整除。
我们把数组中所有数字的二进制表示的每一位都加起来。如果某一位的和能被3整除,那么那个只出现一次的数字二进制表示中对应的那一位是0;否则就是1。
1 class Solution 2 { 3 public: 4 int findTheOnlyNum(vector<int>data) 5 { 6 if (data.size() == 0)return 0; 7 for (auto a : data) calTheBits(a); 8 int res = 0; 9 for (int i = 0; i < 32; ++i) 10 if (bits[i] % 3 == 1)res += pow(2, i); 11 return res; 12 } 13 private: 14 int bits[32] = { 0 }; 15 void calTheBits(int num) 16 { 17 int n = 1; 18 for (int i = 0; i < 32; ++i) 19 { 20 if (num & n)bits[i]++; 21 n = n << 1; 22 } 23 } 24 };