基于visual Studio2013解决面试题之0608找出两个只出现一次的数

来源:互联网 发布:飞鸟各投林 知乎 编辑:程序博客网 时间:2024/05/17 21:42



题目



解决代码及点评

/*    已知数组中有两个数只出现一次,其他成对出现,请找出这两个数    解决办法:    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调试器”运行


程序运行结果








0 0
原创粉丝点击