题目描述
给定一个整数数组
nums
,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。
示例
输入: [1,2,1,3,2,5]
输出: [3,5]
思路
先将所有的数异或,记录二进制结果中第一次出现1的位置,按位置将原集合分成两个子集,对两个子集分别取异或和得到两个数即为结果。示例中所有的数取异或和的结果为6,二进制表示为110,首次出现1 的位置为2,根据这个位置,将集合中的所有二进制 表示第二位为1的数分为一个集合,另外的数为一个集合,分别异或和即为结果。
实现
vector<int> singleNumber(vector<int>& nums) {
vector<int> result;
int res = nums[0];
for (int i = 1; i < nums.size(); i++)
{
res = res ^ nums[i];
}
int index = -1;
int i = 0;
while (res != 0)
{
if ( res >> i & 1)
{
index = i;
break;
}
i++;
}
vector<int> data1, data2;
for (int i = 0; i < nums.size(); i++)
{
if (nums[i] >> index & 1)
{
data1.push_back(nums[i]);
} else {
data2.push_back(nums[i]);
}
}
int num1 = data1[0];
int num2 = data2[0];
for (int i = 1; i < data1.size(); i++)
{
num1 ^= data1[i];
}
for (int i = 1; i < data2.size(); i++)
{
num2 ^= data2[i];
}
result.push_back(num1);
result.push_back(num2);
return result;
}