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 ; 
    }
}
posted @ 2021-10-31 22:08  RetenQ  阅读(31)  评论(0编辑  收藏  举报