找到一个数字范围内的差距

时间:2011-12-08 19:53:45

标签: javascript algorithm math

我正在寻找一种解决方案(最好是JavaScript),它会在一组选定的子范围中找到与其父范围相比的差距。

示例1:如果我选择{1,10}的父范围和{1,2}和{2,10}的子范围,我的间隙为0,表示父范围内的范围已经被孩子们完全填满。

示例2:如果我选择{1,10}的父范围和{1-3}和{6,8}的子范围,我将有4的差距。

2 个答案:

答案 0 :(得分:3)

  1. 按子初始编号
  2. 对子范围进行排序
  3. 从第一个子范围的初始编号中减去父范围的初始编号。这是您的总计的开始。
  4. 从以下范围的初始数字中减去范围的第二个数字
  5. 如果3.的结果为正,则添加到运行总计
  6. 最后从父范围的第二个数字中减去最后一个范围的第二个数字,添加到正在运行的总数
  7. 结果总数是缺失数字的数量,假设您只使用整数。

答案 1 :(得分:0)

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

所以在javascript中创建一个带有start和end属性的范围对象,然后携带这些的数组。使一个函数rangeSub(parent,child)进行减法,其中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.
}

仍有一些边缘情况需要解决,但这是我要遵循的一般形式。