给定两个范围[a,b),[c,d),检查它们是否相交

时间:2015-03-21 04:09:00

标签: algorithm

我从cscareerquestions找到的Google电话采访问题是

  

给定两个范围[a,b),[c,d),检查它们是否相交。

http://www.reddit.com/r/cscareerquestions/comments/2xrzst/just_got_rejected_from_google_after_my_phone/

受访者说:

  

我刚刚计算出两个范围的中点和半径。然后检查中点的差异是否小于半径总和。

     

面试官提到了两件事。当取得差异时,如果一个小于另一个,那该怎么办?我说,只要检查并确保你以正确的方式做到这一点。通话结束后大约10分钟,我意识到我只能使用差异的绝对值。然后他提到[)表示法意味着包容性,所以你不包括最后一个值。所以我只是递减了每个范围的结束。

有什么好方法可以解决这个问题?有人会解释使用例子吗?

1 个答案:

答案 0 :(得分:2)

这是教科书答案:

如果两个范围不相交,则其中一个范围完全位于另一个范围的左侧,也就是说: b c d 。比较是≤因为范围是半开的;例如,如果 b = c ,则范围不相交,因为 b 不在[ a 中, b'/ em>的)。

如果上述情况不属实,则范围相交:

b c d a )≡ b c d a b > c d > ;


现在,现实生活中的编程怎么样?除此之外,还有另一种情况,即两个范围不相交:当一个或两个范围都是空的时。

这很重要,因为空的范围往往会出现,并且它们可能有任意的端点。你当然不希望报告[0,2)和[1,1]交叉,因为他们没有,这可能是一个重要的错误。

那么让我们问一个不同的问题:两个范围的交集是什么?答案非常简单:交叉点的左侧边缘是两个范围的左侧边缘中较大的一个,而右侧边缘是右侧边缘中较小的一个。在数学上:

[ a b [ c < / em>, d [ max a c ), min b d

如果半边开放范围是空的,如果它的右边缘小于或等于其左边缘,我们可以产生更有弹性的定义:

范围相交 [ a b [ c d min b d )&gt;的最大 C