【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}; } };