1、Single Number I
1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) { 4 if(nums.size()==0) return NULL; 5 int res=nums[0]; 6 for(int i=1;i<nums.size();i++) 7 { 8 res^=nums[i]; 9 } 10 return res; 11 } 12 };
2、Single Number II
int 共有32位,假设把所有的数相加,则并且每位上产生的进位不累计进入其他位:
因为一共只有一位个数为1,其他位个数都为3,则这些数相加,每位上累计个数取余3为0,或者1,最后把这位合并就是个数为1 的数。
这种做法可以通用,并且只用了两个变量。
1 class Solution { 2 public: 3 int singleNumber(vector<int>& nums) { 4 int result = 0; 5 int count =0 ; 6 for(int i=0; i<32; i++) 7 { 8 count =0; 9 for(int j=0; j<nums.size(); j++) 10 count += (nums[j]>>i)&1; 11 result |= (count%3)<<i; 12 } 13 return result; 14 } 15 };
3、Single Number III
1 class Solution { 2 private: 3 int last1(int n) 4 { 5 int i=0; 6 while(((n>>i)&1) == 0) 7 { 8 i++; 9 } 10 return i; 11 } 12 bool isRange(int n, int i) 13 { 14 if(((n>>i)&1) ==1) 15 return true; 16 else return false; 17 } 18 public: 19 vector<int> singleNumber(vector<int>& nums) { 20 vector<int> res; 21 if(nums.size()<2) 22 return res; 23 int num = 0; 24 for(int i=0; i<nums.size(); ++i) 25 { 26 num = num^nums[i]; 27 } 28 int n = last1(num); 29 int a=0, b=0; 30 for(int j=0; j<nums.size(); ++j) 31 { 32 if(isRange(nums[j], n)) 33 { 34 a = a^nums[j]; 35 } 36 else 37 { 38 b = b^nums[j]; 39 } 40 } 41 res.push_back(a); 42 res.push_back(b); 43 return res; 44 } 45 };