当前位置 博文首页 > m0_51723227的博客:骚年,你真的懂了位运算 异或 吗?

    m0_51723227的博客:骚年,你真的懂了位运算 异或 吗?

    作者:[db:作者] 时间:2021-08-03 21:07

    数组nums包含从0到n的所有整数,但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗?

    示例 1:

    输入:[3,0,1]
    输出:2

    示例 2:

    输入:[9,6,4,2,3,5,7,0,1]
    输出:8

    该题链接

    题解:

    我们先不看这个顺序乱的数组,而是假设有一个顺序完整的数组.

    然后还需要知道^的一个特性:

    A ^ A = 0

    A ^ 0 = A

    异或具有交换律: A^B^C = C^A^B

    上图:

    image-20210520205713761

    那么我们把每个下标以及该下标对应的数字进行连续异或, 异或过程就是0^0^1^1^2^2^3^3^4^5^5^6^6^7,而我们上面已经说了相同的数字进行异或,结果是0,所以最后就是0^0^0^0^4^0^0^7,发现还是有相同的,继续上面步骤,结果就等于4^7 (运用上面的特性相同异或为0) 我们发现4就是我们需要的结果,但是这里还有个7,怎么办,再次 异或7

    有个小问题,7是什么??7是数组的长度.

    再比如:

    image-20210520210944284

    0^0^0^1^1^2^2^3^3 等于 0.

    但是我们需要的结果是4,而4是什么?4就是数组长度.

    好了,现在我们再看看开始那个题,开始那个题与现在顺序数组有什么区别呢??对,就是顺序乱了.但是影响吗???不会,因为异或具有交换律

    比如 [0,4,1,2]

    异或过程就是0^0^1^4^2^1^3^2 等价于 0^0^1^1^2^2^3^4 等于 3^4 再给它异或长度4,就是我们求的3

    代码(函数部分):

    int missingNumber(int* nums, int numsSize)  //nums是 数组的首地址(指针)   numsSize是数组大小
    {
        int ret = 0;
        for(int i = 0;i<numsSize;i++)
        {
            ret = ret^i^nums[i];
        }
        return ret ^ numsSize; //别忘记异或一个数组大小
    }
    
    cs