题意
传送门 LeeCode 面试题56 - I. 数组中数字出现的次数
题解
两个相同的数异或为 0 0 0,若求一个数组中除了一个数字其余数字都出现偶数次,则对数组依次异或操作,结果即为该奇数次数字。
题中存在 2 2 2 个奇数次数字,遍历数组异或后得到这 2 2 2 个数的异或结果,需要将其转化为只有 1 1 1 个奇数次数的问题。那么将其分组即可,将奇数次数字分到不同的 2 2 2 个组,其余偶数次数字中相同的分到同一组;做法是找到异或结果中某一为 1 1 1 的位,意味着在这一位上两个奇数次数字不同,那么对这一位 0 0 0、 1 1 1 两种请况分组异或即可得到两个奇数次数字的值。
class Solution {
public:
vector<int> singleNumbers(vector<int>& nums) {
int n = nums.size();
int x = 0;
for(int i = 0 ; i < n; i++){
x ^= nums[i];
}
int y = 1;
while(!(x & y)){
y <<= 1;
}
int x1 = 0, x2 = 0;
for(int i = 0; i < n; i++){
if(nums[i] & y) x1 ^= nums[i];
else x2 ^= nums[i];
}
return vector<int>{x1, x2};
}
};