题目
解决代码及点评
/*已知数组中有两个数只出现一次,其他成对出现,请找出这两个数解决办法: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;// 将所有元素的异或值保存在xResultint xResult = s[0];for (int i = 1; i < len; ++i){xResult ^= s[i];}// 并且保存在aResult和bResult,最后aResult和bResult将会输出不同的两个数int aResult = xResult, bResult = xResult;// 计算哪个位为1int 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做异或,这样相当于将数组分成两部分了elsebResult ^= 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.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行
程序运行结果