力扣上一道题-异或运算

发布时间 2023-04-19 23:12:51作者: 针眼画师

看了书上的按位运算,大概了解了异或运算的意思:

简单来说,就是对应的位不相等,为真。因为位操作是针对二进制,只有01,所以前面那句话可以举例为:
0^0=0;
1^1=0;
1^0=1;
0^1=1;

题目如下:

题目
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

用异或运算处理的思路如下:

既然按位运算时有0^1=1,那对两个整数进行比较就有例如:00000000^10011011=10011011;,也就是0^a=a;;同理有a^a=0;
那接下来怎么利用这个工具解决问题呢?
我们再退回题目看:除了一个数之外,其他数都是成对的,而每一对数据进行异或都等于0,只有一个数和这个剩下的0进行异或,自然就把这个落单的数筛选出来了。
似乎还是让人不放心,因为成对的数据并不一定是相邻的,如果是类似:a^b^c^b^a^c这样的,它的结果和a^a^b^b^c^c一样吗?
一样的,因为异或运算满足交换律和结合律。所以可以有:(a^b^...^s^p)^ans == 0^ans
C语言代码
// 通过异或运算筛选,注意,重复出现的数字是成对的,这是关键条件
int singleNumber(int* nums, int numsSize)
{
    int ans =0;
    for (int i=0; i<numsSize; i++)
    {
        ans ^= nums[i];
    }

    return ans;
}