Нахождение пробелов в диапазоне чисел - PullRequest
1 голос
/ 08 декабря 2011

Я ищу решение (желательно JavaScript), которое бы обнаруживало пробелы в выбранном наборе дочерних диапазонов по сравнению с их родительским диапазоном.

Пример 1. Если я выбираю родительский диапазон {1,10} и дочерние диапазоны {1,2} и {2,10} У меня будет пробел 0, означающий, что диапазон в родительском диапазоне полностью заполнен его дочерними элементами.

Пример 2: Если явыберите родительский диапазон {1,10} и дочерние диапазоны {1-3} и {6,8}. У меня будет разрыв 4.

Ответы [ 2 ]

3 голосов
/ 09 декабря 2011
  1. Сортировка дочерних диапазонов по их начальному номеру
  2. Вычтите начальный номер родительского диапазона из начального номера первого дочернего диапазона. Это начало вашего промежуточного итога.
  3. Вычтите второе число диапазона из начального числа следующего диапазона
  4. Если результат 3. положительный, добавить к промежуточному итогу
  5. Наконец, вычтите второе число последнего диапазона из второго числа родительского диапазона, добавьте к итоговой сумме

Итоговая сумма - это число пропущенных чисел, при условии, что вы используете только целые числа.

0 голосов
/ 09 декабря 2011

В общем случае разрыв также будет диапазоном или набором диапазонов. Пример родителя: {1-10}, дети {1,2}, {5,8}, пробел {3,4}, {9,10}, поэтому я просто предлагаю вам написать вещь, которая может вычесть один диапазон от другого тогда примените это к родителю для каждого ребенка. Есть 3 случая, чтобы рассмотреть: это в начале, в середине (создание двух диапазонов) или в конце. Затем, когда вы вычитаете из набора диапазонов, вы должны учитывать все случаи, где может быть перекрытие.

, поэтому в javascript создайте объект диапазона с начальным и конечным свойством, а затем перенесите их в массив. Сделайте функцию 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.
}

Есть еще несколько крайних случаев, которые нужно решить, но это общая форма, которой я бы следовал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...