题目描述:
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
莫贝特提供的算法是:用1001个数组元素的和减去1-1000的和(即n*(n-1)/2)。
我想如果用于求和的sum变量不算辅助存取空间的话。那么用散列的思想效率更高,因为在大多数情况下,不用遍历
整个数组就可以找到重复的数字。
代码:

Code
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace study
{
class Program
{
static void Main(string[] args)
{
const int len=20;
int[] x = new int[len+2];
int i,j,k,t;
Random rand=new Random();
for (i = 1; i < len+1; i++) x[i] = i;
x[len + 1] = rand.Next(1, len);
j = 1; k = len + 1;
x[0] = x[j];
x[j] = x[k];
x[k] = x[0];
for (i = 0; i <len; i++) //随机化
{
j = rand.Next(1, len+1);
k = rand.Next(1, len + 1);
x[0] = x[j];
x[j] = x[k];
x[k] = x[0];
}
j = 1;
while (true)
{
if (x[j] == -1)
{
Console.WriteLine("is :{0}", j);
break;
}
else
{
k = j;
j = x[j];
x[k] = -1;
}
}
Console.ReadLine();
}
}
}
1-1000放在含有1001个元素的数组中,只有唯一的一个元素值重复,其它均只出现
一次。每个数组元素只能访问一次,设计一个算法,将它找出来;不用辅助存储空
间,能否设计一个算法实现?
莫贝特提供的算法是:用1001个数组元素的和减去1-1000的和(即n*(n-1)/2)。
我想如果用于求和的sum变量不算辅助存取空间的话。那么用散列的思想效率更高,因为在大多数情况下,不用遍历
整个数组就可以找到重复的数字。
代码:


using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
namespace study
{
class Program
{
static void Main(string[] args)
{
const int len=20;
int[] x = new int[len+2];
int i,j,k,t;
Random rand=new Random();
for (i = 1; i < len+1; i++) x[i] = i;
x[len + 1] = rand.Next(1, len);
j = 1; k = len + 1;
x[0] = x[j];
x[j] = x[k];
x[k] = x[0];
for (i = 0; i <len; i++) //随机化
{
j = rand.Next(1, len+1);
k = rand.Next(1, len + 1);
x[0] = x[j];
x[j] = x[k];
x[k] = x[0];
}
j = 1;
while (true)
{
if (x[j] == -1)
{
Console.WriteLine("is :{0}", j);
break;
}
else
{
k = j;
j = x[j];
x[k] = -1;
}
}
Console.ReadLine();
}
}
}