面试题:产生一个长度为100的数组,为数组中的每一项随机填充1-100之间的数并且保证不重复



这是一道面试题:

参考网上3种方法,C#实现:



方法一:

#region 方法一
//存放1-100个数
int[] num = new int[100];
//indexNum[0]=1;…indexNum[99]=100;(不重复)
for (int i = 0; i < num.Length; i++)
{
num[i] = i + 1;
}
Random r = new Random();
//存放最终结果
int[] result = new int[100];
int max = 100;//设置随机数最大值
for (int j = 0; j < result.Length; j++)
{
//计算出随机产生的数组索引(0-99) 注:上界值:100 无法取到
int index = r.Next(0, max);
//取出该索引位置所存的数
result[j] = num[index];
//用最后一个数替换掉已被放入result中的数
//这样num数组中从0到max-1又都是未被存放入result而且不重复的数了
num[index] = num[max - 1];
//随机产生的数组索引最大值减一
max–;
}
//打印结果
for (int i = 0; i < 100; i++)
{
if (i % 10 == 0)
{
Console.WriteLine(“/r/n”);
}
Console.Write(result[i] + “ “);
}
Console.Read();
#endregion
  

 

 

 

方法二:

Dictionary<int, int> result = new Dictionary<int, int>();
Random r = new Random((int)DateTime.Now.Ticks);
int temp;
for (int i = 0; i < 100; i++)
{
do
{
temp = r.Next(1, 101);
}
while (result.ContainsValue(temp));

result.Add(i, temp);
}

foreach (var item in result)
{
if (item.Key % 10 == 0)
{
Console.WriteLine(“/r/n”);
}
Console.Write(item.Value + “ “);
}
Console.Read();
#endregion


 

 

方法三:

int[] num = new int[100];
int temp;
Random r = new Random();
for (int i = 0; i < 100; i++)
{
temp = r.Next(1, 101);
num[i]=GetNumber(num, i, 1, 101, temp,r);
}

for (int i = 0; i < num.Length; i++)
{
if (i%10==0)
{
Console.Write(“/r/n”);
}
Console.Write(num[i] + “ “);
}
Console.Read();


 

GetNumber:

/// <summary>
/// 递归对比重复值
/// </summary>
static int GetNumber(int[] a, int index, int minValue, int maxValue, int temp, Random r)
{
for (int i = 0; i < index; i++)
{
if (a[i] == temp)
{
int newTemp = r.Next(minValue, maxValue);
a[index] = newTemp;
return GetNumber(a, index, minValue, maxValue, newTemp, r);
}
}
return temp;
}


 

至于效率,也应该是从一到三,逐个递减吧。

 



版权声明:本文为博主原创文章,未经博主允许不得转载。