之前看过类似的,不过还是想了好久
class Solution {
public:
int singleNumber(vector<int>& nums) {
// 原理类似于两个取异化,这个方法是标记三个,标记三个需要两位也就是这里的first, last
// 某一位有一个 1 出现,标记位加1,当标记位为3 时,即 first = last = 1;
// first 和 last 同时置 0;
int first = 0;
int last = nums[0];
int tmp = 0;
for (int i = 1; i != nums.size(); ++i) {
tmp = nums[i];
first = first | (last & tmp); // 进到前面一位
last = last ^ tmp;
// 标志位置0
tmp = ~(last & first);
first = first & tmp;
last = last & tmp;
}
return last;
}
};