

题目
解决代码及点评
/*
已知数组中有两个数只出现一次,其他成对出现,请找出这两个数
解决办法:
1)简化问题,如果数组中只有一个数出现一次,那么只要对这个数组做异或即可
2)所以这个问题的根本是,怎么把这两个数分开在两组里,这两组数据都有问题1)的特点
3)再分别找出这两个数
分组办法:
1)将所有数据做异或,那么这个结果相当于两个只出现一次的那个值的异或
2)在这个结果里,找出某个位置为1的位
3)根据这个位的值,将数组分成两组,一组是该位为0,一组该位为1
这种分法,把两个不同的值分在两组,并且两组中其他的数是成对出现的
*/
#include <iostream>
using namespace std;
void find(int s[],int len)
{
if(len<2) return;
// 将所有元素的异或值保存在xResult
int xResult = s[0];
for (int i = 1; i < len; ++i)
{
xResult ^= s[i];
}
// 并且保存在aResult和bResult,最后aResult和bResult将会输出不同的两个数
int aResult = xResult, bResult = xResult;
// 计算哪个位为1
int bit = 0;
while (!(bResult & (1 << bit))) ++bit;
// 通过该位得到一个该位为1的数,这个数将把整个数组分成两部分
int andValue = 1 << bit;
for (int i = 0; i < len; ++i)
{
// 如果数组中某个数,该位为1,则与aResult做异或
if (s[i] & andValue)
aResult ^= s[i];
// 否则与bResult做异或,这样相当于将数组分成两部分了
else
bResult ^= s[i];
}
// 输出结果
cout << aResult << " " << bResult << endl;
}
// 测试主函数
int main() {
int s[]={1,2,7,4,5,4,5,2,6,1};
int len=sizeof(s)/sizeof(int);
find(s,len);
system("pause");
return 0;
}
代码下载及其运行
代码下载地址:http://download.youkuaiyun.com/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果