C#算法之向一个集合中插入随机不重复的100个数
一道非常经典的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个数的更多相关文章
- Mongoose在向集合中插入文档时的集合命名问题
Mongoose使用结构化的模式应用到MongoDB集合,为MongoDB Node.js原生驱动程序提供了更多的功能和简化了数据库操作. 从创建连接到向数据库中写入一个条数据经历了以下步骤: 1.连 ...
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...
- js向一个数组中插入元素的几个方法-性能比较
向一个数组中插入元素是平时很常见的一件事情.你可以使用push在数组尾部插入元素,可以用unshift在数组头部插入元素,也可以用splice在数组中间插入元素. 但是这些已知的方法,并不意味着没有更 ...
- 基于python 3.5 所做的找出来一个字符串中最长不重复子串算法
功能:找出来一个字符串中最长不重复子串 def find_longest_no_repeat_substr(one_str): #定义一个列表用于存储非重复字符子串 res_list=[] #获得字符 ...
- java集合 collection-list-ArrayList 将自定义对象作为元素存到ArrayList集合中,并去除重复元素。
import java.util.*; /* 将自定义对象作为元素存到ArrayList集合中,并去除重复元素. 比如:存人对象.同姓名同年龄,视为同一个人.为重复元素. 思路: 1,对人描述,将数据 ...
- NoSQLBooster如何MongoDB的部分文档从一个集合拷贝到另外一个集合中
假设MongoDB数据库中存有collection_A和collection_B两个集合,如下图所示: (一)先从集合collection_A中拷贝选择的文档 打开collection_A,看到目前有 ...
- 从一个集合中过滤另一个集合中存在的项(类似in)
直接贴代码出来: List<PriceMark> list = PriceMarkDAL.m_PriceMarkDAL.GetList("Erp_ProName='TLC7528 ...
- java中的ArrayList 使得集合中的对象不重复
JAVA中的List接口存放的元素是可以重复的,在这个我重写对象里面的equals()方法,让集合里存放的对象不能重复 首先建一个类,在里面的main()方法中实现 list1中存放的是可以重复对象的 ...
- 从一个集合中查找最大最小的N个元素——Python heapq 堆数据结构
Top N问题在搜索引擎.推荐系统领域应用很广, 如果用我们较为常见的语言,如C.C++.Java等,代码量至少也得五行,但是用Python的话,只用一个函数就能搞定,只需引入heapq(堆队列)这个 ...
随机推荐
- M2: XAML Controls(2)
在前小节中,我们在Card程序的主界面中加入了简单的XAML控件, 本小节将在其基础上进行优化,使界面看上去更加美观.本小节用到了Grid Control, Border Control,以及XAML ...
- ${param.origin}
拦截器中设置未登录拦击跳转链接 response.sendRedirect(request.getContextPath() + "/loginAndRegister/loginAndReg ...
- VC++ ADO相关
<VC对ADO的操作> ADO概述: ADO是Microsoft为最新和最强大的数据访问范例 OLE DB 而设计的,是一个便于使用的应用程序层接口. ADO 使您能够编写应用程序以通过 ...
- OJ上 G++ 与 C++ 的区别
1.输出double类型时,如果采用G++提交,scanf采用%lf,prinf采用%f,否则会报错 2.使用GCC/G++的提醒: 对于64位整数, long long int 和 __int64 ...
- libvirt
http://libvirt.org/index.html libvirt supports: The KVM/QEMU Linux hypervisor The Xen hypervisor on ...
- [solr] - Facet
Solr facet使用于分类统计,是最好的工具.下面例子使用facet将可模拟查询搜索出租房信息. 1.在schema.xml中的内容如下: <?xml version="1.0&q ...
- visual.studio.15.preview5 编译器
前段时间微软更新了新版开发工具visual studio 15 preview5,安装后连文件结构目录都变了,想提取编译器还找不到. 不是原来的VC\BIN目录,已迁移到IDE\MSVC\14.10. ...
- server application error应用错误
本地使用IIS测试ASP脚本网页,结果发现提示[Server Application Error The server has encountered an error while loading a ...
- Junit4常用注解
Junit4注解 JUnit4的测试类不用再继承TestCase类了.使用注解会方便很多. @Before:初始化方法@After:释放资源@Test:测试方法,在这里可以测试期望异常和超时时间@Ig ...
- ios多线程开发的常用三种方式
1.NSThread 2.NSOperationQueue 3.GCD NSThread: 创建方式主要有两种: [NSThread detachNewThreadSelector:@selector ...