我的日程安排可以从21:00到04:00 大多数情况下,这些时间表可能会超过00:00小时标记 现在我还要添加从00:00到23:59的正常时间表 我想计算相同的交叉点 目前我正在使用
if(((mytime1.start_time <= mytime2.end_time) && (mytime2.start_time <= mytime1.end_time))).
考虑到转换日计划时,我仍然没有有效的傻瓜证明逻辑,请帮忙。
答案 0 :(得分:1)
bool DoIntervalsOverlap(int s0, int e0, int s1, int e1)
{
return s0 - e0 <= (unsigned int) s0 - e1 || s1 - e1 <= (unsigned int) s1 - e0;
}
首先,请注意,实质上,所有算术都是无符号的。在s0 - e0 <= (unsigned int) s0 - e1
中,e1
转换为unsigned int
以匹配s0
,s0 - e0
转换为unsigned int
以匹配(unsigned int) s0 - e1
。下面,我假设所有算术都是无符号的。
回想起来,我希望我以相反的顺序写下这些条款。我们现在解决这个问题。 s0 - e0 <= s0 - e1
相当于e0 - s0 >= e1 - s0
。 (即使在无符号算术中也是如此。)现在我们可以将e0 - s0
和e1 - s0
视为 e0 和 e1 转换为参考的时间 s0 位于原点的框架。在此框架中,当天早些时候比原始 s0 的任何时间都被包装成大的正数。所以,午夜时分的包裹消失了。我们只有从 s0 测量的非负时间。然后我们看到e0 - s0 >= e1 - s0
询问“是 e1 ,从 s0 衡量,是否小于或等于 e0 ?”这个问题相当于[ s0 , e0 ]中的“是 e1 吗?”
因此,这两个条件询问[ s0 , e0 ]内是否 e1 或者是 e0 [ s1 , e1 ]?“如果任何一个区间在另一个区间内结束,则区间重叠。如果两者都不在另一方内部,则它们不会重叠。
答案 1 :(得分:0)
按顺序考虑第一个间隔中的每个时刻。如果这些瞬间都不与第二个间隔的开始一致,则两个间隔不相交,除非间隔已经从开始交叉,在这种情况下,第一个间隔中的第一个瞬间将发生在沿着第二个间隔的类似通过中间隔。因此,如果第一个区间的开始和结束是(l1,r1),第二个区间的开始和结束是(l2,r2),我们可以通过查看l1是否包含在[l2,r2]范围内以及是否包含l2来进行检查在[l1,r1]范围内。如果lx在数值上不大于rx,那么这是一个简单的检查,看看是否例如(l1> = l2)&amp;&amp; (l1&lt; = r2)。如果lx大于rx那么它是一个环绕间隔,你可以检查是否(l2> = l1)|| (l2&lt; = r1)。