位运算思维解题技巧一:异或^---消除重复
引子:如何找出数组中唯一重复的数
原本的思路就是加一个辅助空间统计次数,但题目要求不需要加辅助空间
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