位运算的应用----找出落单的数
基本描述:一个数组里面除了某一个数字之外,其他的数字都出现了两次。设计一个算法去找出这个只出现了一次的数字。
要是没学过位运算的话,估计又想着去暴力枚举了,不合适,数据量大了会很麻烦的,还是用位运算。因为数组中只有一个元素是不重复两次的,用0去一次与数组元素进行异或,出现两次的数异或之后为0,只出现了一次的数便求出来了,这样做时间和空间都比暴力节省不少。不多逼逼,放代码。
#include <iostream>
#include<stdlib.h>
using namespace std;
int main()
{
int n = 1001;
int *a = new int[n];
for (int i = 0; i <n ; i+=2)//在数组的前1000个内存空间中存数,都为奇数
{
a[i] = i + 1;
a[i + 1] = a[i];
//cin >> a[i];
}
a[n-1] = 1;
for (int i = 0; i < n; i++)
cout << a[i] << " ";
cout << endl;
int x = 0;
for (int i = 0; i < n; i++)
x = x ^ a[i];//核心
cout << "唯一落单的数:" << x << endl;
return 0;
}
这里因为要生成1000个两两重复的数,懒得去手输,直接for赋值了,这样生成的数都是奇数,在最后一个单元去赋一个偶数,这样最后这个数就变成了唯一不重复的数,用0去依次做异或运算便可得到结果。