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(堆队列)这个 ...
随机推荐
- cocos2d项目 打包apk 项目名称相关设置
修改android项目名称(打包生成的默认apk名称),直接找到proj.android目录下.project文件夹里面比较靠前的xml配置,修改<name>项目名称</name&g ...
- Sprint第二个冲刺(第十三天)
一.Sprint 计划会议: sprint2计划的功能还没有全部完成,还在实现剩余的两个功能模块,目前工作进展还比较顺利,争取下一个sprint完成剩余的所有目标. 以下是真机测试下的拍照和系统相册取 ...
- pycharm安装
license server http://idea.lanyus.com
- kernel/panic.c
/* * linux/kernel/panic.c * * Copyright (C) 1991, 1992 Linus Torvalds */ /* * This function is us ...
- php部分--session的三种用法
一.在不同页面之间显示用户的信息 二.控制登录 1.登录页面 <body> <form action="loginchuli.php" method=" ...
- mybatis中的mapxml的语法
<select id="a" resultMap="map"> select * from `table` where (po_type='1') ...
- archlinux 学习笔记
磁盘规划 cfdisk 格式化分区 mkfs.ext4 /dev/sda1 mkswap /dev/sda5 mkfs.ext4 /dev/sda6 挂载根分区和boot分区,并建立家目录 mount ...
- Qt之QComboBox(基本应用、代理设置)(转)
QComboBox下拉列表比较常用,用户可以通过选择不同的选项来实现不同的操作,如何实现自己的下拉列表呢? 很多人在问QComboBox如何设置选项的高度.代理等一些问题!今天就在此分享一下自己的一些 ...
- JSBinding + SharpKit / 编译 Cs 成 Js
轻轻一点菜单:[JSB | Compile Cs to Js] 主要产出:StreamingAssets/JavaScript/SharpkitGeneratedFiles.javascript,你的 ...
- .NET垃圾回收:非托管资源,IDispose和析构函数的结合
http://blog.jobbole.com/85436/ 原文出处: 田小计划 欢迎分享原创到伯乐头条 前面一篇文章介绍了垃圾回收的基本工作原理,垃圾回收器并不是可以管理内存中的所有资源.对于 ...