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(堆队列)这个 ...
随机推荐
- A candidate solution for Java Web Application - current session
Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...
- UVa 439骑士的移动(BFS)
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- Nginx-限制汇总
http块 limit_conn_zone $binary_remote_addr zone=connperip:10m; limit_conn_zone $server_name zone=conn ...
- windbg
1, symbols : srv*c:\symbols*http://msdl.microsoft.com/download/symbols 2,.loadby sos mscorwks or ...
- docker swarm
1.docker pull swarm 2.docker run --rm swarm create #创建cluster id b1442105f281c7eaa31f8e5d815fe0e2 3. ...
- bootstrap表格内容垂直居中
td{ vertical-align: middle !important;}
- Android分享中,如何过滤指定的应用,并且对不同的分享方式发送不同的内容?
网上找到的一篇关于: 针对不同的应用,使用不同的方式的文章.原文地址 String contentDetails = ""; String contentBrief = " ...
- 微信公众平台开发教程(十一)微信"企业号“上线
什么是企业号? 企业号是微信为企业客户提供的移动应用入口 关注更安全 只有企业通讯录的成员才能关注企业号,分级管理员.保密消息等各种特性确保企业内部信息的安全. 应用可配置 企业可自行在企业号中可配置 ...
- oracle case when 在查询时候的用法。
select count(1), features_level from (SELECT i.features_level, i.features, T.BASEAMINE_ID, T.COLUMN_ ...
- linux 平均负载 load average 的含义
load average 的含义 平均负载(load average)是指系统的运行队列的平均利用率,也可以认为是可运行进程的平均数. 以路况为例, 单核CPU.单车道 情况如下: 0.00-1. ...