题目给出:
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5], return [3, 5]. 并且要求线性时间内解决。
For example:
Given nums = [1, 2, 1, 3, 2, 5], return [3, 5]. 并且要求线性时间内解决。
分析与解法:
我们知道跟他很相似但是比其简单的一道题,就是有一组数,其中有一个数出现过一次,其余的数均出现2次,求出现一次的那个数,方法为从开始异或 到尾。根据异或的特性,两个相同的数异或后为0.最后得到出现一次的那个数字。
以nums = [1, 2, 1, 3, 2, 5]为例, 我们从头异或操作到尾会得到
1^2^3^1^3^2^5=3^5
可以得到
3^5,不能得到3和5.
我们可以求得3^5的最低为1的那位。因为异或操作不同为1,相同为0,也就是说在最低为1的那一位3和5在那位是不同的:例如3=011; 5=101 那么3^5为110,那么最低为1那位 是第2为。按照这个不同,我们将整个数据分为2组一组在第二位为1的,第二组在第二位为0,分别在各组内异或。就会求得两个数。
代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int first(int number)
{
int i=0;
for(i;i<32;i++)
{
int t=1<<i;
if((t&number)==t)
{
return i;
}
}
}
vector<int> singleNumber(vector<int>& nums) {
int result_temp=nums[0];
for(int i=1;i<nums.size();i++)
{
result_temp=result_temp^nums[i];
}
int save=result_temp;
int index=first(result_temp);
index=1<<index;
for(int i=0;i<nums.size();i++)
{
if((nums[i]&index)==index)
{
result_temp=result_temp^nums[i];
}
}
save=save^result_temp;
vector<int> v;
v.push_back(result_temp);
v.push_back(save);
return v;
}
};
int main()
{
int a[22]={-1638685546,-2084083624,-307525016,-930251592,-1638685546,1354460680,623522045,-1370026032,-307525016,-2084083624,-930251592,472570145,-1370026032,1063150409,160988123,1122167217,1145305475,472570145,623522045,1122167217,1354460680,1145305475};
vector<int> u;
for(int i=0;i<22;i++)
{
u.push_back(a[i]);
}
Solution s1;
vector<int> r=s1.singleNumber(u);
cout<<r[0]<<" "<<r[1]<<endl;
return 0;
}
#include<vector>
using namespace std;
class Solution {
public:
int first(int number)
{
int i=0;
for(i;i<32;i++)
{
int t=1<<i;
if((t&number)==t)
{
return i;
}
}
}
vector<int> singleNumber(vector<int>& nums) {
int result_temp=nums[0];
for(int i=1;i<nums.size();i++)
{
result_temp=result_temp^nums[i];
}
int save=result_temp;
int index=first(result_temp);
index=1<<index;
for(int i=0;i<nums.size();i++)
{
if((nums[i]&index)==index)
{
result_temp=result_temp^nums[i];
}
}
save=save^result_temp;
vector<int> v;
v.push_back(result_temp);
v.push_back(save);
return v;
}
};
int main()
{
int a[22]={-1638685546,-2084083624,-307525016,-930251592,-1638685546,1354460680,623522045,-1370026032,-307525016,-2084083624,-930251592,472570145,-1370026032,1063150409,160988123,1122167217,1145305475,472570145,623522045,1122167217,1354460680,1145305475};
vector<int> u;
for(int i=0;i<22;i++)
{
u.push_back(a[i]);
}
Solution s1;
vector<int> r=s1.singleNumber(u);
cout<<r[0]<<" "<<r[1]<<endl;
return 0;
}