2016-04-10 92 views
0

我想獲得這個函數來將數組拆分成子集。每個子集的數字都等於前一個數字中的1或前一個數字中的數字。 下面的例子應該返回兩個子集,但它會返回{0,1,2,3}。任何想法我做錯了什麼?另外,是否有更好的方式爲每個新的子集動態創建一個數組?謝謝將數組拆分爲子集

function max_tickets() { 
    var arr = [4, 13, 2, 3]; 
    var myarr = arr.sort(function(a, b){return a-b}); 


for(var i = 0; i<myarr.length; i++){ 

    var iplus = i+1; 
    if(i === i || i === iplus){ 
     newArr= []; 
     newArr.push(i); 
    }else if (i !== i || i !== iplus){ 
     arr2 =[]; 
     arr2.push(i); 
    } 
} 
} 
+0

你的'[4,13,2,3]'示例的期望輸出是什麼? –

回答

1

這應該工作。

function max_tickets() { 
    var arr = [4, 13, 2, 3]; 
    var myarr = arr.sort(function (a, b) { return a - b }); 
    arrSubsets = []; 
    arr1 = []; 
    for (var i = 0; i < myarr.length; i++) { 
     if (myarr[i - 1] === undefined) { 
      arr1.push(myarr[i]); 
      continue; 
     } 
     if (myarr[i] - myarr[i - 1] <= 1) { 
      arr1.push(myarr[i]); 
     } 
     else { 
      arrSubsets.push(arr1); 
      arr1 = []; 
      arr1.push(myarr[i]); 
     } 
    } 
    if (arr1.length > 0) 
     arrSubsets.push(arr1);      
} 
max_tickets(); 
+0

謝謝,我添加了幾行代碼,它效果很好。 – sammyb123

1

根據您的問題:

  • 什麼我做錯了任何想法?

裏面你的循環您使用i,就好像它是數組的值,但環從0去的myarr.length值你的具體情況4的,這樣就使得的i值是0, 1, 2, 3

正如你可以看到你正在使用的index的值進行比較,而不是使用數組的值,以使用數組的值,您必須指定arrayname[index],你的情況myarr[i],這將使你值:4, 13, 2, 3

  • 此外,有沒有更好的方法來爲每個新的子集動態創建一個數組?

是的,你可以在另一陣列中創建一個動態數組裏面循環的:

var b = []; 
for(var i = 0; i < 10; i++){ 
    b.push(['I am' + i, i]); 
} 

正如你在前面的例子中所看到的,我創建b陣列的內部數組所以一旦循環完成b陣列將有10 arrays其中每個2個元素。

+1

,可以扔東西了一下大聲笑....非常感謝你指出這一點。酷個人資料圖片btw – sammyb123

2

你所要做的通常叫做「分區」。該問題的通用版本是使用某些「規則」,謂詞或條件將數組分割成子數組,該條件指定特定元素應該進入哪個分區,或者指定它應該進入新分區。

這樣做的僞代碼將是:

To partition an array: 
    Initialize the resulting array 
    For each element in the array 
    If that element starts a new chunk 
     Create a new empty chunk in the resulting array 
    Add the element to the most recent chunk 
    Return the result 

這可以在JS很直截了當地表示爲

function partition(array, fn) { 
    return array.reduce((result, elt, i, a) => { 
    if (!i || !fn(elt, i, a)) result.push([]); 
    result[result.length - 1].push(elt); 
    return result; 
    }, []); 
} 

現在我們需要寫函數說,當一個新的分區應該開始:

// Is the element within one of the previous element? 
function close(e, i, a) { 
    return Math.abs(e - a[i-1]) > 1; 
} 

我們現在可以用

partition([[4, 13, 2, 3], close)