我今天接受了采访,并被要求检查两次会面是否相互冲突。每次会议都有开始时间和结束时间。
我试图回答这个问题但不是那个具体的问题。有人可以提出一些想法吗?
bool IsConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2)
如果有冲突,应该返回true,如果没有冲突则返回false。
例如
如果符合,则为真:
(s1,e1)= 8,10
(s2,e2)= 9,11
(s1,e1)= 7,10
(s2,e2)= 8,9
(s1,e1)= 8,11
(s2,e2)= 9,11 等等
答案 0 :(得分:18)
这是基本区间代数,请参阅my answer here for more details,但代码如下所示:
bool IsConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2)
{
return (s1 < e2) && (e1 > s2);
}
我假设两个会议开始,而另一个会议没有发生冲突。
答案 1 :(得分:2)
在两个区间的简单情况下,我认为这将有效(未经测试的伪代码):
bool IsConflict(Datatime s1, Datatime e1, Datatime s2, Datatime e2) {
if( s1 < s2 ) {
// meeting 1 starts first
if( e1 > s2 ) return true; // overlap
}
else {
// meeting 2 starts first
if( e2 > s1 ) return true; // overlap
}
return false;
}
答案 2 :(得分:1)
当且仅当max(s1, s2) < min(e1, e2)
时,会议重叠。这种基于交集的方法假设间隔(s, e)
是开放的,并暗示(正确或错误地)空会议s = e
不能与另一次会议重叠。
答案 3 :(得分:1)
以下算法的复杂性为O(nlogn)
public boolean isConflicts(float startTime[], float endTime[])
{
TreeMap<Float, Integer> map = new TreeMap<Float, Integer>();
for (int i = 0; i < startTime.length; i++)
{
map.put(startTime[i], -1);
map.put(endTime[i], 1);
}
Iterator<Integer>iter = map.values().iterator();
while (iter.hasNext())
{
if ((iter.next() + iter.next()) != 0)
{
System.out.println ("Conflicts...");
return true;
}
}
return false;
}
答案 4 :(得分:0)
计划 有三种情况需要检查这个问题。
所以这就是答案。我道歉;这不是最易读的代码行。
代码(伪):
bool isConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2){
return ((s1 >= s2) && (s1 <= e2)) || ((e1 >= s2) && (e2 <= e2)) || (s1 <= s2) && (e1 >= e2));
}