C#算法之向一个集合中插入随机不重复的100个数
一道非常经典的C#笔试题:
需求:请使用C#将一个长度为100的int数组,插入1-100的随机数,不能重复,要求遍历次数最少。
1.最简单的办法
1 var rd = new Random(); 2 List<int> list = new List<int>(); 3 var num = 0; 4 while (list.Count<100) 5 { 6 num = rd.Next(1, 101); 7 if (!list.Contains(num)) 8 { 9 list.Add(num); 10 } 11 }
这种办法无需解释。
2.进阶
var rd = new Random(); var hs = new HashSet<int>(); while (hs.Count < 100) { hs.Add(rd.Next(1, 101)); }
这种方案较上个方案差别不大,HashSet对于重复数据只保存一次,少了个if判断。
3.高级
List<int> list1 = new List<int>(), list2 = new List<int>(); for (int i = 1; i < 101; i++) { list1.Add(i); } var rd = new Random(); while (list2.Count < 100) { var index = rd.Next(0, list1.Count - 1); list2.Add(list1[index]); list1.RemoveAt(index); }
此方案一共遍历200次,初始化遍历100次,重新赋值再遍历100次,并且数字是随机不重复的。
每遍历一次,list1就会删除一个元素,即使产生的随机数据相同,但每次对于list1的索引对应的值是不同的,能保证数字唯一性。

1 using System; 2 using System.Collections.Generic; 3 4 namespace Random100 5 { 6 class Program 7 { 8 static void Main(string[] args) 9 { 10 Test1(); 11 Console.WriteLine("------------------华丽的分割线--------------------"); 12 Test2(); 13 Console.WriteLine("------------------华丽的分割线--------------------"); 14 Test3(); 15 Console.ReadKey(); 16 } 17 18 static void Test1() 19 { 20 var rd = new Random(); 21 List<int> list = new List<int>(); 22 var count = 0; 23 while (list.Count < 100) 24 { 25 var num = rd.Next(1, 101); 26 if (!list.Contains(num)) 27 { 28 list.Add(num); 29 } 30 count++; 31 } 32 foreach (var i in list) 33 { 34 Console.Write(i + "\t"); 35 } 36 Console.WriteLine("Test1共遍历了{0}次.", count); 37 } 38 39 static void Test2() 40 { 41 var rd = new Random(); 42 var hs = new HashSet<int>(); 43 var count = 0; 44 while (hs.Count < 100) 45 { 46 hs.Add(rd.Next(1, 101)); 47 count++; 48 } 49 foreach (var i in hs) 50 { 51 Console.Write(i + "\t"); 52 } 53 Console.WriteLine("Test2共遍历了{0}次.", count); 54 } 55 56 static void Test3() 57 { 58 List<int> list1 = new List<int>(), list2 = new List<int>(); 59 var count = 0; 60 for (int i = 1; i < 101; i++) 61 { 62 list1.Add(i); 63 count++; 64 } 65 66 var rd = new Random(); 67 while (list2.Count < 100) 68 { 69 var index = rd.Next(0, list1.Count - 1); 70 list2.Add(list1[index]); 71 list1.RemoveAt(index); 72 count++; 73 } 74 foreach (var i in list2) 75 { 76 Console.Write(i + "\t"); 77 } 78 Console.WriteLine("Test3共遍历了{0}次.", count); 79 } 80 } 81 }
我们来看看这三种方案分别遍历了多少次:
方案一515次,方案二529次,方案一、方案二差不多,全靠人品,方案三始终都是200次,要少得qq多,但方案三有个bug,最后一个数据始终都是100。
如果修复这个bug,或者你有更好的办法,请分享下,不胜感激!
如果觉得对你有帮助,请点个赞,谢谢!
不足与错误之处,敬请批评指正!
posted on 2015-04-30 23:01 xiaoafei1991 阅读(552) 评论(1) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?