在一个数组中找到单独出现两次的数字。具体方法是:
异或之后的结果的分类遵循两种情况,找到异或结果0,1序列最低比特位的非零位
相同的数据被分到相同的组,不同的数据被分到不同的组。这样问题就被简化成为了两个子问题,在每一个里面找到只出现一次的那个数。
分为三个步骤:
1.所有数据异或得到结果序列
2.找到异或结果最后一个非零比特位,把位置记录下来。
3.根据非零比特位的位置进行分类。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
int find_single(int arr[], int len, int*data1, int*data2)
{
assert(arr);
assert(len > 0);
assert(data1);
assert(data2);
int tmp = arr[0];
int i = 1;
while (i<len)
{
tmp ^= arr[i++];
}
int flag = 1;//最低比特位;
while (1)
{
if (tmp & flag)
{
break;
}
else
{
flag << 1;
}
}
*data1 = 0;
*data2 = 0;
for (i = 0; i < len; i++)//分类;
{
if (arr[i] & flag)
{
*data1 ^= arr[i]; //A
}
else
{
*data2 ^= arr[i]; //B
}
}
return 0;
}
int main()
{
int data1;
int data2;
int arr[] = { 11,22,4,3,11,22};
int len = sizeof(arr) / sizeof(arr[0]);
find_single(arr, len, &data1, &data2);
printf("%d %d", data1, data2);
system("pause");
return 0;
}