劍指 數組中只出現一次的數字

題目鏈接

這個兩次用的好啊,給人提醒用異或來做,異或和之後怎麼辦呢,要把這兩個數分開,只有找到其中一個數再異或就能異或出另外個數了,看到牛客網裏別人的做法,通過位運算把異或和是1的那一位找出來再去把所有這一位是1的數都異或一遍就能找到上訴所說的數字了,說的可能有點繞,看代碼應該就懂了。

class Solution {
public:
    void FindNumsAppearOnce(vector<int> data,int* num1,int *num2) {
        int x = 0;
        if(data.size() < 2) {
            return ;
        }
        if(data.size() == 2) {
            *num1 = data[0];
            *num2 = data[1];
            return ;
        }
        for(int i = 0; i < (int)data.size(); i++) {
            x ^= data[i];
        }
        int index = findindex(x), y = 0;
        for(int i = 0; i < (int)data.size(); i++) {
            int time = index, num = data[i]; 
            while(time--) {
                num >>= 1;
            }
            if(num&1) {
                y ^= data[i];
            }
        }
        *num1 = y;
        *num2 = (x ^ y);
    }
    int findindex(int x) {
        int index = 0;
        while((x&1) == 0 && index < 32) {
            x >>= 1;
            index++;
        }
        return index;
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章