源码如下
class Solution {
public:
int singleNumber(vector<int>& nums) {
const int W = sizeof(int) * 8; //
int count[W];
fill_n(&count[0], W, 0);
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < W; j++) {
count[j] += (nums[i] >> j) & 1;
count[j] %= 3;
}
}
int result = 0;
for (int i = 0; i < W; i++) {
result += (count[i] << i);
}
return result;
}
};
创建一个数组,第i位表示在i位出现1的次数, 如果第i位是3的倍数则忽略,否则把该位取出组成答案。
在题解里面提供了用二进制模拟三进制的方法,看不懂,实现不了。不过找到,附在下面,说不定那天就看懂了。
class Solution {
public:
int singleNumber(vector<int>& nums) {
int one = 0, two = 0, three = 0;
for (auto i : nums) {
two |= (one & i);
one ^= i;
three = ~(one & two);
one &= three;
two &= three;
}
return one;
}
};
网友评论