【问题标题】:Meeting Conflict algorithms会议冲突算法
【发布时间】:2011-06-21 14:29:31
【问题描述】:

我今天有一个面试,被要求检查两次会议是否相互冲突。每个会议都有开始时间和结束时间。 我试图回答这个问题,但不是那么具体..有人可以提出一些想法吗?

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 等等

【问题讨论】:

标签: algorithm datetime compare


【解决方案1】:

这是基本的区间代数,参见my answer here for more details,但代码如下所示:

bool IsConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2)
{
    return (s1 < e2) && (e1 > s2);
}

我假设有两个会议,其中一个开始而另一端没有冲突。

【讨论】:

  • 太糟糕了,它是社区 wiki,我认为您应该为该链接答案每位用户投两票。
  • 不,我明确地将其设置为 CW 以避免这种情况,这个问题在松散的术语中是重复的,但足够不同以至于它可以独立存在,但我的答案不会是,因此 CW。
【解决方案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;
}

【讨论】:

  • 虽然我同意 Lasse 的解决方案更优雅,但恕我直言,您的解决方案更容易理解
【解决方案3】:

会议重叠当且仅当max(s1, s2) &lt; min(e1, e2)。这种基于交集的方法假定间隔 (s, e) 是开放的,并暗示(正确或错误地)会议 s = e 不能与另一个会议重叠。

【讨论】:

    【解决方案4】:

    以下算法的复杂度为 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;                 
    }
    

    【讨论】:

      【解决方案5】:

      计划 此问题需要检查三种情况。

      • 案例 1:s1 是否位于区间 [s2,e2] 内 (s1 >= s2) && (s1
      • 案例 2:e1 是否位于区间 [s2, e2] 内 (e1 >= s2) && (e2
      • 案例 3:点 (s2, e2) 是否位于 [s1, e1] 内 (s1 = e2)

      所以这就是答案。我道歉;这不是最易读的代码行。

      代码(伪):

      bool isConflict(Datetime s1, Datetime e1, Datetime s2, Datetime e2){
        return ((s1 >= s2) && (s1 <= e2)) || ((e1 >= s2) && (e2 <= e2)) || (s1 <= s2) && (e1 >= e2));
      }
      

      【讨论】:

        猜你喜欢
        • 2014-04-10
        • 2015-10-02
        • 1970-01-01
        • 2023-03-15
        • 2015-06-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-18
        相关资源
        最近更新 更多