骚年,你真的懂了位运算 异或 吗?
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
上图:
那么我们把每个下标以及该下标对应的数字进行连续异或
, 异或
过程就是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是数组的长度.
再比如:
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; //别忘记异或一个数组大小
}
以上是关于骚年,你真的懂了位运算 异或 吗?的主要内容,如果未能解决你的问题,请参考以下文章