给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
思路:
最开始是直接暴力算的,1200ms,感觉已经超时了,但是通过了,哈哈。看了大佬题解说能用异或运算,才知道什么叫异或,唉
- a ^ 0 = a
- a ^ a = 0
- a ^ b ^ a = a ^ a ^ b = 0 ^ b = b
//异或满足交换律和结合律
由题目可知每个不是答案的数只会出现2次,需要返回的答案只会出现一次,
所以对每个数都异或就行,相当于
a ^ b ^ c ^ d ^ a ^ b ^ c
= a ^ a ^ b ^ b ^ c ^ c ^ d
= d//写成代码就是res ^= nums[i];
这样就得到了需要返回的d
写成代码就是
int singleNumber(int* nums, int numsSize){
int i,res = 0;
if(numsSize == 1) return *(nums+0);
//因为任何数和0异或都得到它本身,所以res初值为0;
for(i = 0; i < numsSize ; i ++)
{
res ^= nums[i];
}
return res;
}