位运算思维解题技巧一:异或^---消除重复

引子:如何找出数组中唯一重复的数

位运算思维解题技巧一:异或^---消除重复

原本的思路就是加一个辅助空间统计次数,但题目要求不需要加辅助空间

so现在我们要用位运算的思维解决这道题 

这里就要用到异或这个符号^,它具有消除重复的功能

位运算思维解题技巧一:异或^---消除重复

思路就是在补(构造)一个1到1000的数组,与原数组做异或

位运算思维解题技巧一:异或^---消除重复

最终就只剩下一个k

是不是很巧妙

思路懂了,代码实现其实就很简单了

#include <iostream>

using namespace std;
#define n 10
/*
//辅助空间法
int main()
{
    int a[11] = {0};
    for(int i = 0;i < n;i++)
    {
        cin>>a[i];
    }
    int b[11] = {0};
    int num = 0;
    for(int i = 0;i < n;i++)
    {
        b[a[i]]++;
    }
    //cout<<0;
    for(int i = 0;i < n;i++)
    {
        if(b[i]==2)
            cout<<i<<endl;
    }

}
//1 2 3 4 5 6 5 7 8 9
*/

//位运算法

int main()
{
    int a[11] = {0};
    for(int i = 0;i < n;i++)
    {
        cin>>a[i];
    }
    int x1 = 0;
//生成1到n-1的数组
    for(int i = 1;i <= n-1;i++)
    {
        x1 = (x1 ^ i);
    }
    for(int i = 0;i < n;i++)
    {
        x1 = x1 ^ a[i];
    }
    cout<<x1;

}

位运算思维解题技巧一:异或^---消除重复

辅助空间法的代码我也给出了

这里就拿十个数试了一下

下面这个题同理哦

位运算思维解题技巧一:异或^---消除重复

再举个例题

位运算思维解题技巧一:异或^---消除重复

这个有点难度哦

答题思路:

思路:

(1)对于出现两次的元素,使用“异或”操作后结果肯定为0,那么我们就可以遍历一遍数组,对所有元素使用异或操作,那么得到的结果就是两个出现一次的元素的异或结果。

(2)因为这两个元素不相等,所以异或的结果肯定不是0,也就是可以再异或的结果中找到1位不为0的位,假如异或结果的最后一位不为0。

(3)这样我们就可以根据最后一位将原数组元素分为两组,一组该位全为1,另一组该位全为0。

(4)再次遍历原数组,最后一位为0的一起异或,最后一位为1的一起异或,两组异或的结果分别对应着两个结果。

给个参考链接:https://www.cnblogs.com/hezhiyao/p/7539024.html

https://blog.****.net/weixin_42110638/article/details/86602714