題目描述
給定一個整數數組
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;
}