Given an array of integers, every element appears three times except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
Subscribe to see which companies asked this question
class Solution {
public:
int singleNumber(vector<int>& nums) {
int n = nums.size();
int res = 0;
int bitnum[32] = {0};
for(int i = 0; i < 32; ++i)
{
for(int j = 0; j < n; ++j)
{
bitnum[i] += (nums[j] >> i) & 1;
}
res |= (bitnum[i]%3) << i;
}
return res;
}
};
解题说明:
1.通过移位运算 和 1进行与运算可以提取出各个每个位上的数字, 将每个位上的数字相加,因为如果出现三个相同的数字时,在模3的时候 该数字会直接略去,剩下的就是那个模三有剩余的
2.然后将所有的这些位反向拼接起来即可 拼接主要是通过右移运算,然后或运算(加法) 组合起来。 该题是位运算的典型代表