leetcode 260. 只出现一次的数字 III medium
题目描述:
解题思路:
两个不相等的元素在位级表示上必定会有一位存在不同。
将数组的所有元素异或得到的结果为不存在重复的两个元素异或的结果。
flag &= -flag 得到出 flag 最右侧不为 0 的位,也就是不存在重复的两个元素在位级表示上最右侧不同的那一位,利用这一位就可以将两个元素区分开来。
代码:
class Solution {
public:
vector<int> singleNumber(vector<int>& nums) {
int flag = 0;
for (int num: nums)
flag ^= num;
// 防止溢出
flag = flag == INT_MIN?flag:(flag & -flag);
int res1 = 0, res2 = 0;
for (int num: nums){
if (num & flag)
res1 ^= num;
else
res2 ^= num;
}
return {res1, res2};
}
};