8 2 4 3 6 3 2 5 5
4 6思路:
代码:
/*
数组中只出现一次的数字
by Rowandjj
2014/8/14
*/
#include<stdio.h>
#include<stdlib.h>
/**
*找到数字xorVal的二进制中第一个值为1的位
*
*/
int FirstBitIs1(int xorVal)
{
int index = 0;
while(((xorVal&1)==0) && (index < 8*sizeof(int)))//不能越界,注意运算符优先级,多加几个括号
{
index++;
xorVal = xorVal>>1;
}
return index;
}
/**
*判断data中第index位(二进制)是否为1
*/
bool isBit1(int data,int index)
{
data = data>>index;
return data&1;
}
/**
* data 目标数组
* len 数组长度
* num1 一个只出现一次的数字
* num2 另一个只出现一次的数字
*/
bool FindNumberAppearOnce(int data[],int len,int *num1,int *num2)
{
if(data == NULL || len < 2)
{
return false;
}
int i;
int xorVal = 0;
for(i = 0; i < len; i++)
{
xorVal ^= data[i];
}
int indexOf1 = FirstBitIs1(xorVal);
*num1 = *num2 = 0;//一定要赋值为0
for(i = 0; i < len; i++)
{
if(isBit1(data[i],indexOf1))
{
*num1 ^= data[i];
}else
{
*num2 ^= data[i];
}
}
return true;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
if(n <= 1)
{
continue;
}
int *arr = (int*)malloc(sizeof(int)*n);
if(!arr)
{
exit(-1);
}
int i;
for(i = 0; i < n; i++)
{
scanf("%d",arr+i);
}
int num1,num2;
if(FindNumberAppearOnce(arr,n,&num1,&num2))
{
if(num1 < num2)
{
printf("%d %d\n",num1,num2);
}else
{
printf("%d %d\n",num2,num1);
}
}
free(arr);
}
return 0;
}/*
数组中只出现一次的数字
*/
#include<stdio.h>
#include<stdlib.h>
bool FindFirstAppearOnceNum(int data[],int len,int *num1,int *num2)
{
if(data == NULL || len <= 1)
{
return false;
}
int i;
int xorVal = 0;
for(i = 0; i < len; i++)
{
xorVal ^= data[i];
}
*num1 = *num2 = 0;//一定要赋值为0
int temp = xorVal & (-xorVal);//结果:xorVal中最右边的1被保留其他位为0
for(i = 0; i < len; i++)//遍历数组,将数组分成两部分,每一部分只有一个数字出现一次
{
if(data[i] & temp)//temp中某一位为1,其他位为0,再与上data[i]就可以将两个只出现一次的数字分开
{
*num1 ^= data[i];
}else
{
*num2 ^= data[i];
}
}
return true;
}
int main()
{
int n;
while(scanf("%d",&n) != EOF)
{
if(n <= 1)
{
continue;
}
int *arr = (int*)malloc(sizeof(int)*n);
if(!arr)
{
exit(-1);
}
int i;
for(i = 0; i < n; i++)
{
scanf("%d",arr+i);
}
int num1,num2;
if(FindFirstAppearOnceNum(arr,n,&num1,&num2))
{
if(num1 < num2)
{
printf("%d %d\n",num1,num2);
}else
{
printf("%d %d\n",num2,num1);
}
}
free(arr);
}
return 0;
}
原文:http://blog.csdn.net/chdjj/article/details/38554947