异或的性质:
1、交换律
2、结合律(即(a^b)^c == a^(b^c))
3、对于任何数x,都有x^x=0,x^0=x
4、自反性 A XOR B XOR B = A xor 0 = A
算法:
class Solution {
public int singleNumber(int[] nums) {
int i,res=0;
for(i=0;i<nums.length;i++){
res=res^nums[i];
}
return res;
}
}
解析过程:
这个算法中主要用到了异或的第三条性质,无论如何,res=res^nums[i]这条式子的计算结果都会以x^x^y或者x^y^x或者y^x^x这些形式出现,而按上面的性质,最终res的结果都是y,比如一组数据[4,1,2,1,2],从头开始,先是定义的res值与第一个元素异或: 0^4=4
4接着与1异或,这里无法化简,接着与2异或,也无法化简,接着与1异或可以利用性质1和性质3消掉1,如下:
(4^1)^2^1=4^2
同理最后有
(4^2)^2=4
4就是结果了