Given an array of integers, every element appears twice except for one. Find that single one.
Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?
class Solution {
public:
int singleNumber(int A[], int n) {
if(n==1)return A[0];
int *hash=new int [2*n-1];
for(int i=0;i<2*n-1;i++)hash[i]=0;
int t;
for(int i=0;i<n;i++)
{
t=A[i]%n;
if(hash[n-1+t]==0){hash[n-1+t]=i;continue;}
if(hash[n-1+t]!=0)hash[n-1+t]=0;
}
for(int i=0;i<2*n-1;i++)
{
if(hash[i]!=0)return A[hash[i]];
}
}
};
注:哈希表
将所有数映射成一个大小为2n-1的表。注意不映射成n-1是因为有可能有负数的情况存在。然后求余数,与函数和下标的关系是下标-余数=n-1。
还有一个问题是,哈希表的初始值设成-1,为了防止设置的值和要找的坐标冲突。
问题:需要额外O(n)空间,时间是O(n)的。
Other Solution:
/*int result=A[0];
for(int i=1;i<n;i++){
result=A[i]^result;
}
return result;*/
XOR异或运算。规则A^B^A=B,A^A=0
思路:将所有的数都异或一遍,得到的就是落单的那个数。