落单的数 III
给出2*n + 2个的数字,除其中两个数字之外其他每个数字均出现两次,找到这两个数字。
样例
给出 [1,2,2,3,4,4,5,3],返回 1和5
挑战
O(n)时间复杂度,O(1)的额外空间复杂度
分析:这道题用位操作,所有的数异或一遍,得到的肯定是两个落单的数的异或值,在两个数的异或值中找一位不等于0,表示在这一位上这两个数肯定不相等。然后根据该位的值是否为1,将数组中的每一个数,分成两个部分,对着
class Solution {
public:
/*
* @param A: An integer array
* @return: An integer array
*/
vector<int> singleNumberIII(vector<int> &A) {
// write your code here
int FistBitPos=0;
int num=0;
int num1=0,num2=0;
vector<int>B;
for(auto n:A)
{
num^=n;
}
int index=FindFirsiBit(num);
for (auto n:A)//分成两组
{
if(FindBitZero(n,index))
num1^=n;
else
num2^=n;
}
B.push_back(num1);
B.push_back(num2);
return B;
}
int FindFirsiBit(int num)//找一个不是0的位
{
int index=0;
while((num&1)==0)
{
num=num>>1;
index++;
}
return index;
}
bool FindBitZero(int num,int index)
{if((num>>index)&1)//位为1
return true;
else
return false;}};