一、题目
二、思路
审题nums[i]都在int范围内(32位二进制),对于每个num[i]的二进制数,对于第j个位置的元素都相加,并且最后对结果的二进制数,其第j个位置的元素依次进行余3操作。
关键:对于数组中的每一个元素 x,我们使用位运算 ( x > > i ) (x >> i)(x>>i) & 1 11 得到 x 的第 i 个二进制位。
注意计算2的i次方可以使用1 << i。
举栗子:
如果输入是:nums = [2,2,3,2],那么它的各个元素对应的32位二进制数就是[00000000000000000000000000000010, 00000000000000000000000000000010, 00000000000000000000000000000011, 00000000000000000000000000000010];
接着,对这些二进制数的对应位进行求和,得到:[00000000000000000000000000000041];
对这个求和结果的每一位进行3的取模运算,得到:[00000000000000000000000000000011];
把上面的结果从二进制转换为十进制,就是:3。
三、代码
class Solution { public: int singleNumber(vector<int>& nums) { int ans = 0; //对所有num[i]的二进制位的数,进行每列二进制数相加 for(int i = 0; i < 32; i++){ int temp_sum = 0; for(int j = 0; j < nums.size(); j++){ temp_sum += ((nums[j] >> i) & 1); } if(temp_sum % 3 == 1){ ans += (1 << i); } } return ans; } };