我从cscareerquestions找到的Google电话采访问题是
给定两个范围[a,b),[c,d),检查它们是否相交。
受访者说:
我刚刚计算出两个范围的中点和半径。然后检查中点的差异是否小于半径总和。
面试官提到了两件事。当取得差异时,如果一个小于另一个,那该怎么办?我说,只要检查并确保你以正确的方式做到这一点。通话结束后大约10分钟,我意识到我只能使用差异的绝对值。然后他提到[)表示法意味着包容性,所以你不包括最后一个值。所以我只是递减了每个范围的结束。
有什么好方法可以解决这个问题?有人会解释使用例子吗?
答案 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 )