骚年,你真的懂了位运算 异或 吗?

Posted 捕获一只小肚皮

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了骚年,你真的懂了位运算 异或 吗?相关的知识,希望对你有一定的参考价值。

数组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; //别忘记异或一个数组大小
}

以上是关于骚年,你真的懂了位运算 异或 吗?的主要内容,如果未能解决你的问题,请参考以下文章

你真的会 &与运算妙用吗?

你真的会 &与运算妙用吗?

136. 只出现一次的数字-异或

Python这些位运算的妙用,绝对让你大开眼界

有人知道C语言中&和^的使用方法吗?

ES6 你是懂了,可你真的会用了吗?(这10点,检验你是否中招了)