/* 已知数组中有两个数只出现一次,其他成对出现,请找出这两个数 解决办法: 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.csdn.net/detail/yincheng01/6704519
解压密码:c.itcast.cn
下载代码并解压后,用VC2013打开interview.sln,并设置对应的启动项目后,点击运行即可,具体步骤如下:
1)设置启动项目:右键点击解决方案,在弹出菜单中选择“设置启动项目”
2)在下拉框中选择相应项目,项目名和博客编号一致
3)点击“本地Windows调试器”运行