您的位置:首页 > Web前端

剑指Offer —— 找出数组中两个只出现了一次的数字

2016-04-07 11:17 441 查看
主要思路是:通过异或操作,消除数组中相同的两个数,结果等于不同的两个数的异或,然后找到异或结果中从右往左第一个是1的是第n位,将数组按照第n位是否为1分为两组,分别组内异或,异或的结果几位只出现了一次的那个数。

vs2015中调试运行通过

#include "stdafx.h"

#include<iostream>

using namespace std;

unsigned int FindFirstBitIs1(int num)

{

unsigned int index = 0;

while (((num & 1) == 0) && index < 8 * sizeof(int))

{

num = num >> 1;

++index;

}

return index;

}

bool IsBit1(int num, unsigned int index)

{

num = num >> index;

return (num & 1);

}

void FindNumsAppearOnce(int data[], int len, int *num1, int *num2)

{

if ((NULL == data) || (len < 2))

return;

int resultExclusiveOR = 0;

for (int i = 0; i < len; ++i)

{

resultExclusiveOR ^= data[i];

}

unsigned int indexOf1 = FindFirstBitIs1(resultExclusiveOR);

*num1 = 0;

*num2 = 0;

for (int j = 0; j < len; ++j)

{

if (IsBit1(data[j], indexOf1))

{

*num1 ^= data[j];

}

else

{

*num2 ^= data[j];

}

}

}

int main()

{

const int length = 10;

int data[length];

int a = 0;

int b = 0;

for (int i = 0; i < length; i++)

{

cin >> data[i];

}

FindNumsAppearOnce(data, length, &a, &b);

printf("a is %d, b is %d",a,b);

while (1);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: