落單的數 III

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

這個時間怎麼這麼久。。。

落單的數 III 



發佈了88 篇原創文章 · 獲贊 28 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章