LeetCode 137. Single Number II

n-1个数字出现3次,1个数字出现1次。

位运算,用cnt[32]记录每个位上,二进制'1'出现的次数。


1) 假设一个数字7, 它出现3次,那么二进制0000 0000 0000 0000 0000 0000 0000 0111会出现三次,

也就是第0, 1, 2位上的二进制'1'会出现3次,那么我们将它%3, 得到的余数为0. 

2) 假设一个数字15, 它只出现1次,那么二进制0000 0000 0000 0000 0000 0000 0000 1111只出现一次,

也就是第0, 1, 2, 3位上的二进制'1'会出现3次,那么我们将它%3, 得到的余数为1.


所以将数组A[]中的所有数字的所有位进行位运算累和至cnt[32], 再将cnt[i] %= 3; (0 <= i < 32), 

cnt[i] == 1, 则代表返回值的第i位(那个只出现过1次的数字的第i位)为1.


代码:

class Solution 
{
public:
    int singleNumber(int A[], int n) 
    {
    	int cnt[32] = {0};
    	int ret = 0;

    	for (int i = 0; i < n; ++ i)
    	{
    		for (int j = 0; j < 32; ++ j)
    		{
	    		unsigned int bit = 1 << j;
	    		cnt[j] += (A[i]&bit)!=0? 1: 0;
    		}
    	}
    	for (int i = 0; i < 32; ++ i)
    	{
    		ret |= (cnt[i]%3)!=0? 1<<i: 0;
    	}

    	return ret;
    }
};


你可能感兴趣的:(LeetCode,C++)