面试题:产生一个长度为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;
}

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

原文发布时间为:2011-03-16

本文作者:vinoYang

时间: 2024-08-03 18:03:01

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

[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素

题目 一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间. 思路一 寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中.如果哈希表中已经存在这个元素则说明这就是个重复元素.这种方法可以很方便的在O(n)时间内完成对重复元素的查找.可是题目要求在O(1)的空间.因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的.题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n

Linux中如何产生一个长度固定(例如文件长度为1M)字节的空文件

如何产生一个长度固定(例如文件长度为 1M )字节的空文件,即每个字节的值全为0x00. dd if=/dev/zero of=/tmp/zero_file bs=http://www.aliyun.com/zixun/aggregation/12560.html">1024 count=1024 示例: [root@localhost software]# dd if=/dev/zero of=/tmp/zero_file bs=1024 count=1024记录了1024+0 的读入记

编程-String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1?

问题描述 String类下的split方法,我截取完字符串后把结果复制给一个数组这个数组长度会加1? 如题,这是代码: String s = ""A1B2C3D4E5F6G7H8""; String[] b = new String[8]; System.out.println(""b:"" + b.length); b = s.split(""[A-Z]""); System.out.

rsa-RSA算法如何生成一个长度较短的秘钥

问题描述 RSA算法如何生成一个长度较短的秘钥 正在使用RSA算法生成秘钥,但是生成的秘钥是在太长,有知道如何生成短一些的秘钥的吗 解决方案 你生成的时候可以指定长度的 比如openssl http://blog.csdn.net/tsuliuchao/article/details/8447690 genrsa -out rsa_private_key.pem 1024 解决方案二: http://www.educity.cn/wenda/457162.html 参考.

求助C# 把一个长度为1026×512的byte型数组 拆分为512个长度为1026的数组

问题描述 求助C#把一个长度为1026×512的byte型数组拆分为512个长度为1026的数组其中1026长度的最后两个1025和1026为顺序标记位(我已经设置好的)再按照顺序标记,重新组成个长度为1024×512的一个数组(这里的1024是把每个1026最后两个顺序位置删除) 解决方案 解决方案二:贵求大神啊---刚开始搞C#不是很会啊解决方案三:顺序标记就是从0数到511啊解决方案四:for(i=0;i<512;i++){byte[]b=newbyte[1026];for(j=i*102

随着下一个预览版本的推出,Linux SQL Server 2017镜像下载量超过了100万

本文讲的是随着下一个预览版本的推出,Linux SQL Server 2017镜像下载量超过了100万[译者的话]这篇文章介绍了在Linux Container中运行SQL Server的方案及其优势以及部分客户案例.SQL Server在很多企业中广泛运用,其容器化所带来的效益值得我们思考和借鉴. [3 天烧脑式容器存储网络训练营 | 深圳站]本次培训以容器存储和网络为主题,包括:Docker Plugin.Docker storage driver.Docker Volume Pulgin.

在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素。

题目:在一个整型数组中有一个元素的出现次数超过了数组长度的一半,试设计一个 在时间上尽可能高效的算法,找出这个元素.要求:(1)给出算法的基本设计思想.(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释.(3)说明你所设计算法的时间复杂度和空间复杂度. (1)基本的设计思想: 一个数字出现的次数超过了长度的一半, 那么我们可以这样认为这个数字出现的个数一定大于其他全部数字出现的个数之和.算法的步骤如下: ①设数组为data[],数组长度为n,i=1.置currentAxi

c语言中怎么把一个大小不确定的二维数组当作参数传入函数中

问题描述 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中 c语言中怎么把一个大小不确定的二维数组当作参数传入函数中,取大神,取大神,取大神 解决方案 用VC++新建一个程序,默认生成的main函数定义如下 int mian(int argc, char* args[]) 这就是一个例子. 解决方案二: 一个表示长度的参数,一个指向二维数组的指针 解决方案三: fun(args[][],int rows,int cols) 解决方案四: void Func(int array[][10]

c-如何定义一个自增之后在二维数组中移动到下一行的指针?

问题描述 如何定义一个自增之后在二维数组中移动到下一行的指针? 如何定义一个自增之后在二维数组中移动到下一行的指针?如何定义一个自增之后在二维数组中移动到下一行的指针? 解决方案 自增是不能移动到下一行的,自增实现的是++, 解决方案二: 用二重数组,比如 int ** arr; arr += 第一维长度; 解决方案三: int a[m][n]={""}; *a+1;表示下一行; *(a+1):表示下一个元素位置. 若果now<n,移动到x行的当前位置:a[m*x+now]. 解