Given a non-empty 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?
Tip:
You can use bitwise to solve this problem.
两个二进制位异或运算的结果为:相同为0,相异为1
用在两个数中,就是把它们的每一个二进制位相异或,例如2和1,2的二进制为0010,1的二进制为0001,异或之后的结果为0011。如果我们把2与2做异或运算,0010与0010异或,就是0000为0了。可见,两个数异或结果为0的等价条件是两个数相等。
假如我们把上面1和2异或的结果再与1异或,就是0011异或0001,结果为0010,为2。假如我们与2异或,就是0011异或0010,结果就是0001,为1。可见多个数异或满足交换律和结合律。即2^1^2=2^2^1=0^1=1
//既然每两个相同的数字异或为0并且满足交换律和结合律,那么所有的数字异或之后的结果就是那个单个数字
#include <stdio.h>
#define MAXN 1000005
long long nums[MAXN];
long long singleNumber(long long* nums, int numsSize);
int main()
{
int N;
scanf("%d", &N);
for(int i = 0; i < N; i++)
scanf("%lld", &nums[i]);
printf("%lld", singleNumber(nums, N));
return 0;
}
long long singleNumber(long long* nums, int numsSize) {
long long ans = nums[0]; //先让ans为数组第一个数
for (i = 1; i < numsSize; i++) {
ans ^= nums[i]; //ans和每一个数做异或运算
return ans; //ans最后的结果即为所求
}