LeetCode Single Number I / II / III

【1】LeetCode 136 Single Numberspa

題意:奇數個數,其中除了一個數只出現一次外,其餘數都是成對出現,好比1,2,2,3,3...,求出該單個數。code

解法:容易想到異或的性質,兩個相同的數異或爲0,那麼把這串數從頭至尾異或起來,最後的數就是要求的那個數。blog

代碼以下:it

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int sum = 0;
        for(int i=0;i<nums.size();i++) 
            sum ^= nums[i];
        return sum;
    }
};

【2】LeetCode 137 Single Number IIio

題意:給一串數,除了一個數只出現一次外,其餘數都出現了三次。求那個單個數。ast

解法:仍是從位操做上考慮,把每一個數寫成二進制列出來,每位對齊,能夠發現,每一位上的1的個數要麼是3的倍數,要麼是3的倍數+1,那麼把每一位的1個數加起來,模3便可的單個數的該位爲0仍是爲1。class

代碼以下:二進制

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for(int i=0;i<32;i++) {
            int dream = (1<<i), cnt = 0;
            for(int j=0;j<nums.size();j++)
                cnt += (bool)(nums[j] & dream);
            cnt = cnt % 3;
            ans ^= (cnt << i);
        }
        return ans;
    }
};

【3】LeetCode 260 Single Number IIIdi

題意:有一串數字,其中有兩個不一樣的數,各出現一次,其餘的數都出現2次。找出這兩個數。co

解法:看到其餘數出現兩次,又想到異或操做,若是所有異或起來,獲得的是那兩個數的異或。既然是兩個不一樣的數,那麼異或的二進制裏面必然是有1的,咱們先找出這個1,而後逐個檢查,若是這位有1,那麼異或到a,不然異或到b,最後的a,b便是這兩個值。找1能夠找最後一個1,x&(-x)便可。

代碼以下:

class Solution {
public:
    vector<int> singleNumber(vector<int>& nums) {
        int xorsum = 0;
        for(int i=0;i<nums.size();i++) xorsum ^= nums[i];
        int lastdifferentbit = xorsum & (-xorsum);
        int a = 0, b = 0;
        for(int i=0;i<nums.size();i++) {
            if(nums[i] & lastdifferentbit) a ^= nums[i];
            else b ^= nums[i];
        }
        return vector<int>{a,b};
    }
};
相關文章
相關標籤/搜索