题目:
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?
题意:
给定整数数组,除了某个数,其他的数都出现了两次。要求线性时间复杂度O(n),O(n)空间
解题思路:
这道题最困难的是要保证在时间复杂度为线性的条件下,还不能占用额外的空间
代码:
方法一:
扫描数组添加到set中,如果出现了2次就从set中erase掉,扫面完后set中唯一一个元素就是我们需要的返回值
class Solution {
public:
int singleNumber(int A[], int n) {
set<int> temp;
set<int>::iterator result;
for (int i = 0; i < n; ++i)
{
result = temp.find(A[i]);
if (result == temp.end())
{
temp.insert(A[i]);
}
else
{
temp.erase(A[i]);
}
}
return *(temp.begin());
}
};
方法二:(最佳解法)
本题题的最佳解法是利用异或运算
利用异或的三个特性:1)相同两个数异或为0 (a ^ a = 0)
2)0异或任何数为任何数(a ^ 0 = 0);
3)异或满足交换律 (a ^ b = b ^ a)。
只要把所有数都异或起来,最后得到的值就是我们所需要的结果
class Solution {
public:
int singleNumber(int A[], int n) {
int res = A[0] ;
for(int i = 1 ; i < n ; i++)
res = res ^ A[i];
return res;
}
};