问题描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
输入: [4,1,2,1,2]
输出: 4
说明:想一想怎么不占用辅助空间
思路
-
题目读完就想到用哈希表来完成,但是这样也太没挑战了,而且空间复杂度为o(n)。
-
那如何优化辅助空间?我想了想,没想出来……/(ㄒoㄒ)/~~
看了别人的解析,发现可以用数学的方法解决:如上述例子[4,1,2,1,2],这里出现了4,1,2 三个不同的数字,那么
2*(4+1+2)-(4+1+2+1+2)=4 相信写到这里意思已经很明了了。 -
最后还有一个骚操作,异或运算!这算是我在这题中最大的收获。
何谓异或运算?简述来说就是对两个数的的二进制进行运算。相同时则为0,不同则为1。例如:
0000 0101
0000 1111
结果:0000 1010这里还需要提一嘴,异或运算满足交换律
例如 4^1^2^1^2 = 1^1^2^2^4 = ......
相同的两个数异或的结果为0,例如12^12=0;
任何一个数与0进行异或的结果为数本身,例如12^0=12;
综上:4^1^2^1^2 = 4
相信写到这,如何用异或运算找这个独崽崽就很容易想了,话不多说,贴代码!
代码(C语言)
思路一二的代码就跳过了,下面是思路三的代码,希望对大家有所帮助
int singleNumber(int* nums, int numsSize){
int res = 0; //初试结果设为0
for(int i=0;i<numsSize;i++){
res=res^nums[i];
}
return res;
}
时空复杂度:o(n),o(1)