Given an array of integers, every element appears three times except for one, which appears exactly once. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
看到题目第一个反应就是利用hash表来解决该问题,但需要耗费O(N)的内存空间以及遍历两次,不符合要求。然后就想着像之前的题目一样如何组合运算符和数字来实现,从整个数来说是不行,但可以从每个位来进行判断。某个位的所有1的个数余3就等于所求数在该位的数值。
代码如下:
class Solution {
public:
int singleNumber(vector<int>& nums) {
int sum = 0;
int result = 0;
for(int i=0;i<32;i++)
{
int mask = 1<<i;
sum = 0;
for(int j=0;j<nums.size();j++)
{
if((nums[j]&mask)!=0)
{
sum++;
sum = sum%3;
}
}
if(sum != 0)
result |= mask;
}
return result;
}
};