2011-12-08 11 views
1

私は、親範囲と比較して選択範囲の子範囲にギャップを見つける解決策(JavaScriptが望ましい)を探しています。数値の範囲内のギャップを見つける

例1:{1,10}の親範囲と{1,2}と{2,10}の子範囲を選択すると、ギャップが0になります。これは親範囲の範囲がそれは子供たちによって完全に満たされた。

例2:私は、{1,10}と{1-3}および{6,8}の子範囲の親の範囲を選択した場合、私は一般的なギャップ4.

+0

子の範囲は任意ですか?また、どのくらいの範囲の話をしていますか? – hackartist

+0

子範囲の数に制限はありません。私が与えた例は1から10の範囲でしたが、何でも構いません。 –

答えて

3
  1. ソートは、最初の子の範囲の最初の番号から親範囲の最初の数を引きます。これは稼働中の合計の始まりです。
  2. 3の結果が肯定的である場合
  3. ランニング合計に追加最後秒から最後の範囲の第二の数を減算し、以下の範囲
  4. の初期数の範囲の第二の数を引き親範囲の数、実行中の合計に加算する

結果の合計は、整数だけを使用していると仮定すると、欠落している数の数です。

0

のギャップを有するであろう範囲または一連の範囲になります。例の親:{1-10}、子供{1,2}、{5,8}、ギャップ{3,4}、{9,10}これは私がちょうど1つの範囲を引くことができるものを書くことを提案する別のものからそれを各子供のための親に適用する。考慮すべき3つのケースがあります:開始時、中間(2つの範囲を生成する)、または終了時ですか?次に、範囲の集合から減算するときは、重複が存在する可能性のあるすべてのケースを考慮する必要があります。

javascriptでは、startオブジェクトとendプロパティを持つrangeオブジェクトを作成し、これらの配列を持ち歩きます。関数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

    関連する問題