LeetCode 260: Single Number III
题目描述
给定一个数字数数组nums,其中两个元素恰好只出现一次,所有其他元素恰好出现两次。查找仅出现一次的两个元素。
解题思路
两个不相等的元素在二进制位级表示上必定会有一位存在不同。
将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。
diff &= -diff 得到出 diff 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。
AC代码
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int n = nums.size();
if (n < 2)
return vector<int>();
int diff = 0;
for (auto num : nums)
diff ^= num; //得到两个数的异或结果
diff &= (-diff); //得到两个数最低位为1、而其他位为0的数
int num1 = 0;
int num2 = 0;
for (auto num : nums)
{
if (num&diff) //如果为1
num1 ^= num;
else
num2 ^= num;
}
return {num1, num2};
}
};