LeetCode0136-利用异或来查找"只出现一次的数字"
位运算
非常巧妙地利用了位运算中异或的性质
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
题解
利用异或的性质
1.任何数和自己异或,结果是0
2.异或满足交换律和结合律
3.任何数和0异或,都会得到本身
根据题意和1,2的性质,我们能知道:本题中出现两次的元素,最终是会和自己消去的
因为交换、结合律,我们最后会把那些出现两次的元素变为0消掉
而只出现一次的数,最后会和0异或,得到它本身
class Solution {
public int singleNumber(int[] nums) {
//利用异或的性质
//1.任何数和自己异或,结果是0
//2.异或满足交换律和结合律
//3.任何数和0异或,都会得到本身
//因此可以得到一个结论:把nums里面的值全部给异或了,出现两次的数字就会被消为0(因为交换和结合,所以与这两个数字出现的位置无关)
//而只出现一次的数字,它最后只会和0异或,然后得到自身,即答案
int result = 0 ;
for(int i = 0; i<nums.length;i++){
result ^= nums[i];
}
return result ;
}
}