题目及要求:
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?
解题思路:
利用整数位操作的性质:数自身与自身异或为0;一个数与0异或为数自身
代码实现:
class Solution {
public:
int singleNumber(int A[], int n) {
int unique = 0;
for(int i = 0; i < n; i++)
unique ^= A[i];
return unique;
}
};
变形题:每个数出现两次,但有两个数分别出现一次,找出这两个数。
解题思路:将数组按这两个数的不同位划分成两个部分,即可分别求出。
class Solution {
public:
void singleNumbers(int A[], int n, int &p1, int &p2) {
int unique = 0, j = 0;
for(int i = 0; i < n; i++)
unique ^= A[i];
for(j = 0; j < sizeof(int)*8; j++) //找到这两个特殊数的不同位
if((unique >> j) & 1)
break;
for(int i = 0; i < n; i++)
if((A[i] >> j) & 1)
p1 ^= A[i];
else
p2 ^= A[i];
}
};