问题描述
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?解决思路
将所有的数变成32位的二进制数,对于每一位,我们将所有的数字(0,1,其实这里只要加1就可以了)相加,然后对3进行取余,则可以得到只出现一次的那个数字的对应位置的数,然后将32位这样的结果组合,就是只出现一次的数。这里可以推广到每个数字出现n次的情况。
3.代码
class Solution {
public:
int singleNumber(vector<int>& nums) {
int res = 0;
for (int i = 0 ; i < 32; ++i ) {
int sum = 0;
for (int j = 0; j < nums.size(); ++j) {
if (nums[j] >> i & 1) {
sum += 1;
sum %= 3;
}
}
res |= sum << i;
}
return res;
}
};