剑指offer——04二维数组中的查找

时间:2019-10-20
本文章向大家介绍剑指offer——04二维数组中的查找,主要包括剑指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 };

原文地址:https://www.cnblogs.com/zzw1024/p/11707762.html