Given 2*n + 1
numbers, every numbers occurs twice except one, find it.
Example
Given [1,2,2,1,3,4,3]
, return 4
思路1:
暴力求解,直接先排序后看异,虽然能AC,但这样做面试官是要打人的……
class Solution {
public:
/**
* @param A: An integer array
* @return: An integer
*/
int singleNumber(vector<int> &A)
{
// write your code here
if(A.size() == 1) return A[0];
sort(A.begin(),A.end());
for(int i=0;i<A.size();i = i+2)
{
if(A[i] != A[i+1])
return A[i];
}
}
};
思路2:
通过异或,相同的数结果为0,那么最后的结果一定是落单的数字。
按位异或的3个特点:
(1) 0^0=0,0^1=1 0异或任何数=任何数
(2) 1^0=1,1^1=0 1异或任何数-任何数取反
(3) 任何数异或自己=把自己置0
异或的运算特点使得该方法被广泛推广用来统计一个数的1的位数!
class Solution {
public:
/**
* @param A: An integer array
* @return: An integer
*/
int singleNumber(vector<int> &A)
{
// write your code here
int ans = 0;
for(int i=0;i<A.size();i++)
ans ^= A[i];
return ans;
}
};