2011-12-08 159 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