一道非常经典的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. Java-->Gson序列化及反序列化

    --> 首先导入jar包,并添加到Build Path --> 需要User类:有属性.构造方法和setter.getter方法. --> Test 测试类: package com ...

  2. asp.net 服务器Button控件使用(onclick和onclientclick使用)

    <asp:Button ID="btn_Save" class="button green" Style="width: 100px; heig ...

  3. id 和 instancetype

    静态数据类型 默认情况下所有的数据类型都是静态数据类型 静态数据类型的特点: 1 在编译时就知道变量的类型 2 知道变量中有哪些属性和方法 3 在编译的时候就可以访问这些属性和方法 4 并且如果是通过 ...

  4. ueditor在使用requirejs时,报ZeroClipboard undefined错误

    再网上找到了 http://blog.csdn.net/xundh/article/details/44536665       这样一篇文章, 其中原因说的很明白了 是因为在有requirejs时, ...

  5. find查找命令的各种使用方法

    find是文件查找工具,实时查找,速度慢,精确匹配 find命令基本使用格式 find [options] [查找路径] [查找条件] [处理动作] 查找路径:默认为当前目录 查找条件:默认为查找指定 ...

  6. 黑马程序员——JAVA基础之IO流缓冲区,转换流,字节流

    ------- android培训.java培训.期待与您交流! ---------- 字符流的缓冲区        缓冲区的出现提高了对数据的读写效率. 对应类 •  BufferedWriter ...

  7. php 函数preg_match、preg_match_all ,以及正则表达式规则

    <?php $str = 'php is the best language phhhhp is'; $part = '/ph{1,}p/'; echo preg_match($part, $s ...

  8. Cookie初识篇

    一.什么是Cookie Cookie,有时也用其复数形式Cookies,指某些网站为了辨别用户身份.进行session跟踪而储存在用户本地终端上的数据(通常经过加密).定义于RFC2109和2965都 ...

  9. Android 百度地图的使用

    可以参考百度官网Android开发指南. 里面有详细的步骤和Sample例子. http://lbsyun.baidu.com/index.php?title=androidsdk/guide/int ...

  10. 操作配置文件Properties

    // */ // ]]>   操作配置文件Properties Table of Contents 1 定义 2 读取配置值 3 修改和保存配置 4 注意 1 定义 csharp中在Settin ...