260. 只出现一次的数字 III
题目:给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例 :
输入: [1,2,1,3,2,5]
输出: [3,5]
思路:遍历nums,通过异或操作,得到结果 s = a ^ b(a, b为恰好只出现一次的元素) 保留s的最后为1的那位保留,其余位置设置为0 ,存入在 k 里面 (如:k = 0000 0100) 3.把 k 和nums中的每一个元素进行 & 操作,可以把nums中所有元素,划分为两组(如:一组0000 0000 , 二组:0000 0100,这样a , b 被划分到不同组中,在对每一个组进行异或,即可提取出a 和 b 了)
vector<int> singleNumber(vector<int>& nums)
{
int sign = 0;
//取得数组中两个唯一数的按位异或结果
for (int i = 0; i < nums.size(); i++)
{
sign ^= nums[i];
}
//获取区分两个唯一数的比特位所代表的值
//也可以写成:sign &= (~sign) + 1
sign &= -sign;
int n1 = 0, n2 = 0;
//通过标识,区分两个数组
for (int i = 0; i < nums.size(); i++)
{
if ((nums[i] & sign) == sign)
n1 ^= nums[i];
else
n2 ^= nums[i]; ;
}
return { n1,n2 };
}