标签:
Given an array of numbers nums
, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.
For example:
Given nums = [1, 2, 1, 3, 2, 5]
, return [3, 5]
.
Note:
[5, 3]
is also correct.Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
主要的问题是怎么把两个只有一个数的A和B分开。
如果全部异或的话得到的结果就是A^B。
A!=B,所以异或的结果中必然存在1,那么为1的那一位对应的A和B必然一个是1,一个是0,这个就可以将所有数字分为两类。
分别异或就能达到两个值了。
获取A,B最后不同的一位的方法是mask=AxorB & (~AxorB-1))。
1 class Solution { 2 public: 3 vector<int> singleNumber(vector<int>& nums) { 4 vector<int> result; 5 if(nums.size()<2) return result; 6 int AxorB = 0; 7 for(int i=0;i<nums.size();i++) 8 { 9 AxorB^=nums[i]; 10 } 11 int mask = AxorB & (~(AxorB-1)); 12 int A=0,B=0; 13 for(int i=0;i<nums.size();i++) 14 { 15 if(mask&nums[i]) 16 { 17 A^=nums[i]; 18 } 19 else 20 { 21 B^=nums[i]; 22 } 23 } 24 result.push_back(A); 25 result.push_back(B); 26 return result; 27 } 28 };
标签:
原文地址:http://www.cnblogs.com/Sean-le/p/4787551.html