2011-12-08 224 views
1

我正在寻找一种解决方案(最好是JavaScript),它可以在选择的子范围集合中找到与父范围相比较的空白。示例1:如果我选择{1,10}的父范围和{1,2}和{2,10}的子范围,则我将有一个0的间隔,这意味着父范围中的范围具有被孩子们完全填满了。查找数字范围内的空白

实施例2:如果我选择的{1,10}和{的1-3}和{6,8}子范围父范围I将具有4

+0

任意数量的子范围?还有我们正在谈论的范围有多大? – hackartist

+0

无限数量的儿童范围。我给出的例子是1到10的范围,但它可以是任何。 –

回答

3
  1. 排序子范围可以通过初始数
  2. 减去父范围的初始数量从所述第一子范围的初始数量。这是你的跑步总数的开始。
  3. 减去一个范围的第二数量从以下范围
  4. 如果3.结果是肯定的初始数量,添加到正在运行的总
  5. 最后减去最后一个范围的第二数量从第二家长范围的数量,加上跑步总数

结果总数是缺失数字的数量,假设您只使用整数。

0

的间隙通常的间隙也将是一个范围或一组范围。父例子:{1-10},孩子{1,2},{5,8},差距{3,4},{9,10}因此我建议你写一个可以减去一个范围的东西然后将其应用于每个孩子的父母。有三种情况需要考虑:它是在开始时,在中间(产生两个范围)还是在结尾。然后,当你从一组范围中减去时,你必须考虑可能存在重叠的所有情况。

所以在javascript中使范围对象具有开始和结束属性,然后携带这些数组。做一个函数rangeSub(父,子)做减法,其中parent可以是一个范围数组,而child是一个单独的范围。

rangeSub(parent, child) { 
    var result; 
    //code for set of range subtraction 
    if(parent.length) 
     for(range in parent) { 
      temp = rangeSub(range,child); 
      if(temp.length) result.concat(temp); 
      else result.push(temp); 
     } 
     return result; 
    } 
    //code for single range subtraction 
    if(parent.start < child.start) { 
     ... 
    } 
    if(parent.end > child.end) { 
     ... 
    } 
    etc. 
} 

仍然有几个边缘情况下工作,但这是我会遵循的一般形式。

+0

观察“差距也将是一个范围或一组范围”是好的;但在说“你必须考虑可能有重叠的所有情况”之后,你并没有说明如何考虑它们。在其他答案中,可能最终比简单方法更复杂。 –

+0

是的,我同意......这就是为什么我没有写完所有案例。但在一般情况下,范围可能很大(如父范围{1,10^20}或类似的东西,你不能有一个数字列表遗漏了,需要在范围内工作。 – hackartist