神奇的亦或
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了神奇的亦或相关的知识,希望对你有一定的参考价值。
一、一个整数数组,只有唯一一个元素出现一次,其他的元素都出现两次,找出这个元素。
解析:根据a^a=0,只需将所有的元素亦或起来,得到的结果就是该元素。以LeetCode 136.为例,代码如下:
class Solution { public: int singleNumber(vector<int>& nums) { int ans=0; for(int i=0;i<nums.size();++i) ans^=nums[i]; return ans; } };
二、一个整数数组,有两个不同的元素各出现一次,其他元素均出现两次,找出这两个元素。
解析:设要求的两个元素为x、y。将所有元素的亦或起来,便得到这两个元素的亦或运算值,并且这个值一定不是0,即,在某位比特位(假设第k位)上值是1。所以根据第k位上的值将数组中的元素分成两部分,分别亦或起来得到的两个值便是x和y的值。以LeetCode 260.为例,代码如下:
class Solution { public: vector<int> singleNumber(vector<int>& nums) { vector<int>ans; int a=0; for(int i=0;i<nums.size();++i) a^=nums[i]; a=a^(a&(a-1)); int x=0,y=0; for(int i=0;i<nums.size();++i) if(nums[i]&a) x^=nums[i]; else y^=nums[i]; ans.push_back(x); ans.push_back(y); return ans; } };
三、有一个长度为n+1的数组,其中的元素是0~n这n+1个数。现在,这个数组中丢失了一个元素,请找回这个元素。
解析:这道题太简单了。。。以LeetCode 268.为例,代码如下:
class Solution { public: int missingNumber(vector<int>& nums) { int xor1=0; for(int i=0;i<nums.size();++i) xor1^=nums[i]^(i+1); return xor1; } };
以上是关于神奇的亦或的主要内容,如果未能解决你的问题,请参考以下文章
Atcoder diverta2019 EXOR Partitioning
BZOJ1954: Pku3764 The xor-longest Path
Codeforces 948D Perfect Security(字典树)