落單的數 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;}};