数组a[N],1至N-1这N-1个数存放在a[N]中,其中某个数重复一次。找出这个数
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;
}