我正在尝试找到相反的交叉点,看看两个团队是否可以互相玩耍,但很难找到准确的代码来完成它。
重新审视以下范围的类将包含两个属性,即开始时间和结束时间,可以是日期时间或时间跨度。每个团队都可以列出这些。时间跨度属性下降到分钟,因此下午2:21有效。
第1组无法在列出的两次之间进行比赛,因此他们只能在上午10:00至下午5:00之间进行比赛。我们存储了排除。
第2组可以在AN-12:00 PM 8:00播放。
意味着Team 1和Team 2可以在10-12之间玩。有没有一种好方法可以在代码中计算出来?
第1队
List<Restriction>
Restriction
StartTime: 8:00 AM
EndTime: 10:00 AM
Restriction
StartTime: 5:00 PM
EndTime: 9:00 PM
第2队
List<Restriction>
Restriction
StartTime: 12:00 PM
EndTime: 9:00 PM
答案 0 :(得分:1)
制作一个包含所有开始和结束时间的数组,包括+1或-1,具体取决于每次是开始时间还是结束时间。
对于你的一套时间,这会给你:
[(08:00, +1), (10:00, -1), (17:00, +1), (21:00, -1), (12:00, +1), (21:00, -1)]
对它们进行排序:
[(08:00, +1), (10:00, -1), (12:00, +1), (17:00, +1), (21:00, -1), (21:00, -1)]
执行加号和减号1的运行总和:
[(08:00, 1), (10:00, 0), (12:00, 1), (17:00, 2), (21:00, 1), (21:00, 0)]
运行总和是当时正忙着开始的队伍数(0,1或2)。所以现在用0标记的时间是两队都空闲的开始时间(这里是10:00和21:00)。阵列中的下一次是自由时段的结束。这给出了两个队伍都有空的时间段,其中包括开始和结束的时间段(-infinity到08:00),(10:00到12:00)和(21:00到+无穷大)。 / p>