算法题:Single Number I
题目来自LeetCode,如下:
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(1)。
读完题目最开始的解决思路是查询整数数组中的每个数是否有相同的数存在,如果不存在,则返回该数,即数组中只出现过一次的数。但是时间复杂度为O(n*n)了,不满足题目要求。
想到c语言书中提到利用异或运算符交换两个值,不需要临时变量的具体过程,将异或运算符应用到该题上,可以解决。
利用异或运算符交换两个值,假如 a = 3, b = 4。想将a和b的值互换,可以用以下赋值语句实现:
a = a ^ b;
b = b ^ a;
a = a ^ b;
执行到第三条赋值语句时,相当于a = a ^ b ^ b ^ a ^ b,即a的值等于a ^ a ^ b ^ b ^ b,等于b。从这里可以看出a ^ b ^ b ^ a ^ b中有两个a,三个b,即多出一个b,结果却等于b,所以用此思路解决Single Number问题:依次将数组中的每个元素异或,等到的结果就是只出现过一次的数。因为任何一个数异或自己的结果为零,并且在异或运算过程中数和数之间是可以交换的,即a ^ b和b ^ a的结果相同。c++代码如下:
class Solution{
public:
int singleNumber(int A[], int n){
if (A == NULL || n == 0){
return 0;
}
int output = 0;
for (int i = 0; i < n; i++){
output ^= A[i];
}
return output;
}
};