一道非常经典的C#笔试题:

需求:请使用C#将一个长度为100的int数组,插入1-100的随机数,不能重复,要求遍历次数最少。

1.最简单的办法

 var rd = new Random();
List<int> list = new List<int>();
var num = ;
while (list.Count<)
{
num = rd.Next(, );
if (!list.Contains(num))
{
list.Add(num);
}
}

这种办法无需解释。

2.进阶

var rd = new Random();
var hs = new HashSet<int>();
while (hs.Count < )
{
hs.Add(rd.Next(, ));
}

这种方案较上个方案差别不大,HashSet对于重复数据只保存一次,少了个if判断。

3.高级

List<int> list1 = new List<int>(), list2 = new List<int>();
for (int i = ; i < ; i++)
{
list1.Add(i);
} var rd = new Random();
while (list2.Count < )
{
var index = rd.Next(, list1.Count - );
list2.Add(list1[index]);
list1.RemoveAt(index);
}

此方案一共遍历200次,初始化遍历100次,重新赋值再遍历100次,并且数字是随机不重复的。

每遍历一次,list1就会删除一个元素,即使产生的随机数据相同,但每次对于list1的索引对应的值是不同的,能保证数字唯一性。

 using System;
using System.Collections.Generic; namespace Random100
{
class Program
{
static void Main(string[] args)
{
Test1();
Console.WriteLine("------------------华丽的分割线--------------------");
Test2();
Console.WriteLine("------------------华丽的分割线--------------------");
Test3();
Console.ReadKey();
} static void Test1()
{
var rd = new Random();
List<int> list = new List<int>();
var count = ;
while (list.Count < )
{
var num = rd.Next(, );
if (!list.Contains(num))
{
list.Add(num);
}
count++;
}
foreach (var i in list)
{
Console.Write(i + "\t");
}
Console.WriteLine("Test1共遍历了{0}次.", count);
} static void Test2()
{
var rd = new Random();
var hs = new HashSet<int>();
var count = ;
while (hs.Count < )
{
hs.Add(rd.Next(, ));
count++;
}
foreach (var i in hs)
{
Console.Write(i + "\t");
}
Console.WriteLine("Test2共遍历了{0}次.", count);
} static void Test3()
{
List<int> list1 = new List<int>(), list2 = new List<int>();
var count = ;
for (int i = ; i < ; i++)
{
list1.Add(i);
count++;
} var rd = new Random();
while (list2.Count < )
{
var index = rd.Next(, list1.Count - );
list2.Add(list1[index]);
list1.RemoveAt(index);
count++;
}
foreach (var i in list2)
{
Console.Write(i + "\t");
}
Console.WriteLine("Test3共遍历了{0}次.", count);
}
}
}

全部代码

我们来看看这三种方案分别遍历了多少次:

方案一515次,方案二529次,方案一、方案二差不多,全靠人品,方案三始终都是200次,要少得qq多,但方案三有个bug,最后一个数据始终都是100。

如果修复这个bug,或者你有更好的办法,请分享下,不胜感激!

如果觉得对你有帮助,请点个赞,谢谢!

不足与错误之处,敬请批评指正!

C#算法之向一个集合中插入随机不重复的100个数的更多相关文章

  1. Mongoose在向集合中插入文档时的集合命名问题

    Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...

  2. PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?

    首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...

  3. js向一个数组中插入元素的几个方法-性能比较

    向一个数组中插入元素是平时很常见的一件事情.你可以使用push在数组尾部插入元素,可以用unshift在数组头部插入元素,也可以用splice在数组中间插入元素. 但是这些已知的方法,并不意味着没有更 ...

  4. 基于python 3.5 所做的找出来一个字符串中最长不重复子串算法

    功能:找出来一个字符串中最长不重复子串 def find_longest_no_repeat_substr(one_str): #定义一个列表用于存储非重复字符子串 res_list=[] #获得字符 ...

  5. java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。

    import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...

  6. NoSQLBooster如何MongoDB的部分文档从一个集合拷贝到另外一个集合中

    假设MongoDB数据库中存有collection_A和collection_B两个集合,如下图所示: (一)先从集合collection_A中拷贝选择的文档 打开collection_A,看到目前有 ...

  7. 从一个集合中过滤另一个集合中存在的项(类似in)

    直接贴代码出来: List<PriceMark> list = PriceMarkDAL.m_PriceMarkDAL.GetList("Erp_ProName='TLC7528 ...

  8. java中的ArrayList 使得集合中的对象不重复

    JAVA中的List接口存放的元素是可以重复的,在这个我重写对象里面的equals()方法,让集合里存放的对象不能重复 首先建一个类,在里面的main()方法中实现 list1中存放的是可以重复对象的 ...

  9. 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构

    Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个 ...

随机推荐

  1. redis-persist上线

    九月份惨不忍睹,因为代码质量不够高,直接被Boss喷成了筛子.被反复教育说要高质量的代码,要可维护.高性能…… 幸而,最后一周终于在紧张的加班中,灰度上线redis-land-go了,项目也改名为re ...

  2. linux之"server" directive is not allowed here in

    配置完rewrite之后重启nginx发现如下错误 "server" directive is not allowed here in* 原因是因为 外部配置的simple.con ...

  3. linux之tmpwatch命令

    系统使用时间长后会产生临时文件(/tmp下),需要清理.但清理的时候不推荐使用rm -rf.这样有时会引起程序的僵死. tmpwatch的说明: [root@AY121231034820cd91077 ...

  4. checkbox提交多组数据到action

    突然想通过checkbox来提交多组数据到action,一时间想不起来怎么写,到网上流岚大婶们的笔迹之后,有了新发现! 方法一: 在action用一个String类型的变量来接受checkbox传过来 ...

  5. 关于 MAXScript 拷贝文件夹及内容到其他位置

    之前用 hiddenDOSCommand 本机测试通过,但是换其他电脑有时会不能用... fn xcopy oldfile newfile = ( newfilepath = newfile + &q ...

  6. 黑马程序员——JAVA基础之标准输入输出流

    ------- android培训.java培训.期待与您交流! ---------- 标准输入输出流: System中的基本字段,in,out 它们各代表了系统标准的输入和输出设备. 默认输入设备是 ...

  7. Winform中调用js函数

    var wb = new WebBrowser(); wb.AllowNavigation = true; wb.ScriptErrorsSuppressed = false; wb.Navigate ...

  8. 转载: 正确处理浏览器在下载文件时HTTP头的编码问题(Content-Disposition)

    最近在做一个下载工具时,发现CSDN上的资源下载时竟然没有被拦截到,经过分析,终于有了一个发现,解决了我之前做文件下载时的乱码问题,所以转载这篇释疑文章,希望有人可以看到,可以从中得到帮助,也用来备忘 ...

  9. 【转】关于.net framework4.0以及4.5安装失败,“安装时发生严重错误”……

    也不知道管不管用,先记着 今天忽然想装一个vs2010,然后装了好几遍,每次都在安装.net4.0的时候失败.好吧,我自己手动装行么.于是手动去装.net 4.0. 结果在还是返回"安装时发 ...

  10. Asp.net中WebForm 与 MVC的架构区别

    ASP.NET Webform 后台代码(behind code) 这种behind code 模式有5个问题,我们用MVC的设计思想来分别解决这些问题 1.基于视图的方案来解决基于行为的需求 从上图 ...