您的位置:首页 > 其它

找出数组中唯一的重复元素

2013-03-15 15:20 253 查看
数组a
,1至N-1这N-1个数存放在a
中,其中某个数重复一次。找出这个数
void xor_findDup1(int *a,int N)
{//方法一:求和
int tmp1 = 0;
int tmp2 = 0;

for(int i = 0;i < N - 1; ++i)
{//tmp1为1...N-1的和,tmp2为数组所有元素的和

tmp1 += (i + 1);
tmp2 += a[i];
}
tmp2 += a[N-1];

printf("%d\n",tmp2 - tmp1);

}

void xor_findDup2(int *a,int N)
{//方法二:异或法
int i;
int result = 0;
for(i = 0;i < N;++i)
{
result ^= a[i];
}
for(i = 1;i < N;++i)
{
result ^= i;
}
printf("%d\n",result);
}

#define sum(x) ((x)((x)+1)/2))
void xor_findDup3(int *a,int N)
{//方法三(a):位图法

int *arrayflag = (int*)malloc(N * sizeof(int));
int i = 1;

while(i < N)
{
arrayflag[i] = false;
++i;
}
for(i = 0;i < N; ++i)
{
if( arrayflag[a[i]] == false)
arrayflag[a[i]] = true;
else
{
printf("%d\n",a[i]);
return ;
}
}

}

int FindMoreInteger1(int *a,int N)
{//方法三(b):hash
int i;
for(i = 0; i < N; ++i)
{
if( a[i] > 0)
{
if(a[a[i]] > 0)
{
a[a[i]] = -a[a[i]];
}
else
return -a[i];
}
else
{
if(a[-a[i]] > 0)
{
a[-a[i]] = -a[-a[i]];
}
else
{
return -a[i];
}
}
}
}

int FindMoreInteger2(int *a,int N)
{//方法四:寻找环的入口点(重复元素)
int x,y;
x = y = 0;
do
{
x = a[a[x]];    //x一次走两步
y = a[y];       //y一次走一步
}while(x != y);     //相遇点

x = 0;
do
{
x = a[x];
y = a[y];
}while(x != y);    //寻找入口点
return x;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: