【发布时间】:2011-08-11 10:06:06
【问题描述】:
假设我们有这样的数据结构:
var sequences = new List<Tuple<int, int>>
{
new Tuple<int, int>(1, 10),
new Tuple<int, int>(8, 101),
new Tuple<int, int>(102, 103),
new Tuple<int, int>(104, 104),
new Tuple<int, int>(110, 200)
};
我想从这个集合中得到两个结果:
- 所有缺失的数字(在本例中:105、106、107、108、109)
- 所有重叠的数字(在本例中:8、9、10)
我可以编写一个包含几个循环和辅助集合的算法。这当然可行,但我想知道这是否可以在 LINQ 和/或其他更简单、更短的算法的帮助下实现?
编辑: 我上面例子中的数据结构代表 5 个序列,第一个包含从 1 到 10 的数字,第二个包含从 8 到 101 的数字,依此类推......因为在生产中,序列可以更大(最多到数百万),它们不是用实际的集合来表示的(例如用具有所有数字的列表),而是用元组来表示,它表示每个序列的最小和最大数量。
【问题讨论】:
-
我不明白您为什么称 8、9 和 10 为“重叠数字”。我不明白您为什么拨打 105、106、107、108、109 缺少号码。 -1
-
系列不连续 - 缺少数字
-
@Matt Ellen:元组中的数字代表一个序列中的第一个和最后一个数字,所以序列
1..10与序列8..101重叠,并且序列@987654324之间存在间隙@ 和110..120. -
@Matt Ellen Д:我假设每个元组的第一个和第二个数字代表一个包含数字范围的下限和上限。 8、9 和 10 是“重叠的”,因为它们同时包含在第一个范围(1 到 10)和第二个范围(8 到 101)中。 105、106、107、108 和 109 是“缺失”的,因为它们不包含在任何范围内。