按连续性汇总整形集合,有点儿意思。
有些算法我们在学习时会觉得枯燥无味,但是如果在实际应用中能够解决问题,就会变得很有意思。
今天在开发中遇到一个需求,将一个无序的整形集合,按数字之间的连续性进行汇总,如
3,1,2,4,9,8,10,6
这八个数按照连续性汇总后,应该生成如下形式的汇总字符串,注意是对连续的数进行了汇总
1-4,6,8-9,10
我们需要提供一个公共方法来处理这个问题:
string GetStrFromIntList(List<Int> listNumbers);
方案一 最小数累积法
那么怎么实现这个需求呢,我首先想到了一个方法:
1,循环这个集合,找出最小的数N
2,找出比N大1的数M,再按此逻辑找到比M大1的数X,以此类推,直到找出最后一个连续大1的数
3,将已找出的数剔除掉并存到另外一个集合,再继续下一轮
最开始的写法是这样的:
static string GetStrByIntNumbers(List<int> listNumbers) { string strResult = string.Empty;//用作输出结果 List<int> listTemp = new List<int>(); int temp = 0; while (listNumbers.Count != 0) { temp = listNumbers.Min();//取得最小数 listTemp.Add(temp); listNumbers.Remove(temp); var a = listNumbers.Where(m => m - 1 == temp).FirstOrDefault();//找出大于1的连续数 if (a != 0)//如果有大于1的数则增加进连续数的集合 { listTemp.Add(a); } else //如果没有大于1的数则开始新的连续数段寻找 { var min=listTemp.Min(); var max=listTemp.Max(); if (min != max) { strResult += min + "-" + max; } else { strResult += min; } listTemp.Clear(); strResult += ","; } } strResult = strResult.Substring(0, strResult.Length-1); return strResult; } 现在来使用实际的数来测试:结果:但是这个方法的写法实在有些繁琐,有没有更好的办法呢?您有吗?第二种方法 冒泡排序 再比较
这种方法,如果参数不是List<int>而是,int[]的话就需要使用到冒泡排序了,这里给出一个冒泡的算法
List<int> listTest = new List<int>() { 1,3,5,24,7,6,8,9,10,14 }; int temp = 0; for (int i = 0; i < listTest.Count; i++) { for (int j = i + 1; j < listTest.Count; j++) { if (listTest[i] > listTest[j]) { temp = listTest[i]; listTest[i] = listTest[j]; listTest[j] = temp; } } } for (int i = 0; i < listTest.Count; i++) { Console.WriteLine("排?序¨°后¨?第ì¨2{0}个?数oy为a:{1}", i, listTest[i]); } 当然,我们使用的是泛型,可以直接用泛型中的方法对集合进行大小排序:
listTest = listTest.OrderBy(m => m).ToList(); 排序完成后呢,我们将进行如下操作
1,从第一位开始,读入到另外的集合A中,并在集合listTest中删除此元素
2,循环listTest时,需先判断是不是刚好比集合A中元素大1,是则需加到集合A,不是的话另外加
List<int> listTest = new List<int>() { 1,3,5,24,7,6,8,9,10,14 }; int temp = 0; for (int i = 0; i < listTest.Count; i++) { for (int j = i + 1; j < listTest.Count; j++) { if (listTest[i] > listTest[j]) { temp = listTest[i]; listTest[i] = listTest[j]; listTest[j] = temp; } } } string strTemp = string.Empty; List<int> listResult = new List<int>(); foreach(var item in listTest) { if (listResult.Count == 0) { listResult.Add(item); } else { if (listResult.Max() + 1 == item) { listResult.Add(item); } else { var min = listResult.Min(); var max = listResult.Max(); strTemp += (min == max) ? (min + ",") : (min + "-" + max + ","); listResult.Clear(); listResult.Add(item); } } } Console.WriteLine(strTemp); Console.Read(); 我相信有更好的办法的,再想想喽。。。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?