首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

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

作者:  时间: 2011-06-16

 

为了尽快完成面试,第一反应就是想到先创建数组,然后随机产生1-100的数字,再与数组进行比较,数组中没有此数字时进行,虽然这种方法不好,但能够实现功能。示例代码如下:

static void Main(string[] args)

int[] num = new int[100];

 

List<int> temp = new List<int>();

 

Random rand = new Random();

int number = 0;

for (int index = 0; index < num.Length; index++)

{

        do

        {

            //随机产生1-100的数字

            number = rand.Next(1, 100);

        }while(temp.IndexOf(number) != -1);

   

        num[index] = number;

        temp.Add(number);

}

//显示数据

foreach (int item in num)

{

        Console.Write(string.Format("{0}\t", item));

}

Console.Read();

回家后,上机编写代码进行测试,发现上面这个方法不仅不好,而且效率非常低,根本显示不出数据。

经过思考:1-100之间的数,产生一个长度为100的数组,不就是将这一百个数填充的数组中吗,只是填充的位置可以随机是产生而已。为此写下如下实现程序:

static void Main(string[] args)

{

int[] num = new int[100];

Random rand = new Random();

int number = 1;

for (int index = 0; index <= 99; index++)

{

    num[index] = number++;

   

    //随机产生数组下标

    int randIndex = rand.Next(0, index);

    //进行数据替换

    int temp = num[randIndex];

    num[randIndex] = num[index];

    num[index] = temp;

}

foreach (var item in num)

{

 Console.Write(string.Format("{0}\t",item));

}

 

Console.Read();

}

    这样实现好像不太符合考题要求,只随机打乱已经填充的数据。经过再次思考,还可采用先准备一个1-100的数据集合,使用随机方式获取集合中的数字到数组中,获取过的数字进行移除后,再进行随机获取。实现程序如下:

class Program

    {

        static void Main(string[] args)

        {

            List<int> list = new List<int>();

            for (int number = 1; number <= 100; number++)

            {

                list.Add(number);

            }

            //随机获取列数中的一个数字,获取完后,移除此数字

            int[] num = new int[100];

            Random rand = new Random();

            int listIndex = 0;

            for (int index = 0; index <= 99; index++)

            {

                listIndex = rand.Next(0, list.Count - 1);

                num[index] = list[listIndex];

               

                list.Remove(num[index]);

            }

            //显示数据

            foreach (int item in num)

            {

                Console.Write(string.Format("{0}\t", item));

            }

            Console.Read();

        }

    }

    这样实现效率比较高,也符合题目要求,随机组成组成。

不知这个题目是谁先想到考我们的,这样实现是否达到老师的要求,是否还有更好的实现方法?欢迎赐教!