c# - 在 C# 中合并间隔与合并距离
问题描述
给定一个区间列表 [start, end] 我必须根据指定的合并距离合并它们。间隔以特定顺序到达,并且当它们到达时,它应该在收到每个间隔时根据指定的合并距离合并它们。其中一些间隔将被删除(在到达流中它们将被标记为已删除)——在这种情况下,我必须将原始间隔视为从未存在过。例子:
合并距离为 7 - 在以下示例中,输入按顺序到达
我尝试了以下算法来合并它们,但我的输出不像上面的例子。有人可以帮助我吗,我在这里缺少什么!
这是我的代码。
class Program
{
static void Main(string[] args)
{
var intervals = new List<Interval>
{
new Interval
{
start = 1,
end = 20
},
new Interval
{
start = 55,
end = 58
},
new Interval
{
start = 60,
end = 89
},
new Interval
{
start = 15,
end = 31
},
new Interval
{
start = 10,
end = 15
},
new Interval
{
start = 1,
end = 20
}
};
var mergedIntervals = Merge(intervals, 7);
foreach (var item in mergedIntervals)
{
Console.WriteLine($"[{item.start}, {item.end}]");
}
Console.ReadKey();
}
public static List<Interval> Merge(List<Interval> intervals, int mergeDistance)
{
var result = new List<Interval>();
for (int i = 0; i < intervals.Count; i++)
{
var newInterval = new Interval(intervals[i].start, intervals[i].end);
//while (i < intervals.Count - 1 && newInterval.end >= intervals[i + 1].start)
while (i < intervals.Count - 1 && newInterval.end <= mergeDistance) // intervals[i + 1].start)
{
newInterval.end = Math.Max(newInterval.end, intervals[i + 1].end);
i++;
}
result.Add(newInterval);
}
return result;
}
}
public class Interval
{
public int start { get; set; }
public int end { get; set; }
public Interval()
{
}
public Interval(int start, int end)
{
this.start = start;
this.end = end;
}
}
解决方案
你能试试这个代码吗,工作演示代码在这里
class Program
{
static void Main(string[] args)
{
var intervals = new List<Interval>
{
new Interval
{
start = 1,
end = 20,
isAdded = true
},
new Interval
{
start = 55,
end = 58,
isAdded = true
},
new Interval
{
start = 60,
end = 89,
isAdded = true
},
new Interval
{
start = 15,
end = 31,
isAdded = true
},
new Interval
{
start = 10,
end = 15,
isAdded = true
},
new Interval
{
start = 1,
end = 20,
isAdded = false
}
};
var mergedIntervals = Merge(intervals, 7);
foreach (var item in mergedIntervals)
{
Console.WriteLine($"[{item.start}, {item.end}]");
}
Console.ReadKey();
}
public static List<Interval> Merge(List<Interval> intervals, int mergeDistance)
{
var result = new List<IntervalGroup>();
var group = new IntervalGroup();
foreach (var item in intervals)
{
group = result.Where(c => c.Groups.Any(g =>
Math.Abs(g.end - item.start) <= mergeDistance ||
Math.Abs(g.end - item.end) <= mergeDistance)).FirstOrDefault();
if (group != null && item.isAdded)
{
group.Groups.Add(item);
}
else if(item.isAdded)
{
group = new IntervalGroup();
group.Groups = new List<Interval>();
result.Add(group);
group.Groups.Add(item);
}
else if(item.isAdded == false)
{
group.Groups.Remove(group.Groups.Where(c => c.start == item.start && c.end == item.end).First());
}
}
var finalResult = result.Select(s => new Interval { start = s.Groups.Min(min => min.start), end = s.Groups.Max(min => min.end) });
return finalResult.ToList();
}
}
public class Interval
{
public int start { get; set; }
public int end { get; set; }
public bool isAdded { get; set; }
public Interval()
{
}
public Interval(int start, int end, bool isAdded)
{
this.start = start;
this.end = end;
this.isAdded = isAdded;
}
}
public class IntervalGroup
{
public List<Interval> Groups { get; set; }
}
推荐阅读
- geb - Geb If Else 或尝试捕获处理
- blueprism - 在使用 Blue Prism 工具输入文本之前,我应该如何启用文本字段?
- node.js - MongoDB 查询在 $or 中具有多个变体,其中至少 x 语句必须匹配
- swift - 如何通过 getBytes() 读出 .rgba16Float MTLTexture
- rust - std::marker::Unpin 不满意
- javascript - 将 3d 文本旋转 javascript 文件转换为特定于角度组件的打字稿文件
- python - 如何生成具有特定形状值的数组?
- azure-devops - 在 Azure DevOps 上设置电子邮件通知
- android - 如何从android(kotlin)中的地点ID获取地点详细信息
- elasticsearch - ELK-Stack 中未使用/处理的索引模板