按连续性汇总整形集合,有点儿意思。
时间:2011-04-21 来源:Leon Weng
有些算法我们在学习时会觉得枯燥无味,但是如果在实际应用中能够解决问题,就会变得很有意思。
今天在开发中遇到一个需求,将一个无序的整形集合,按数字之间的连续性进行汇总,如
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,将已找出的数剔除掉并存到另外一个集合,再继续下一轮
最开始的写法是这样的:
listTest = listTest.OrderBy(m => m).ToList(); 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; } 现在来使用实际的数来测试:
结果:
但是这个方法的写法实在有些繁琐,有没有更好的办法呢?您有吗?
相关阅读 更多 +