在 JavaScript 中對陣列進行排序,並將所有相同的(重複的)數字分組到它們各自的子陣列中


在這個問題中,我們必須透過建立它們的子陣列來對陣列中的所有重複資料進行分組。建立子陣列後,我們必須按排序順序排列它們。這個問題可以透過資料結構的搜尋技術來解決。

理解問題

因此,為了解決這個問題,我們將以兩種方式使用 javascript 的 reduce() 方法。reduce 方法是一種迭代方法,它使用 reducer 函式迭代陣列中的所有專案。

因此,透過逐一檢查,我們將跟蹤所有元素並將它們儲存在一個單獨的變數中,並在迭代陣列中的所有元素後對它們進行分組。

演算法 - 第一種方法

步驟 1:在此步驟中定義所有必要的變數。在我們的例子中,我們建立了一個名為“arrayData”的陣列。

步驟 2:現在,為了迭代陣列的所有專案,我們將使用 javascript 的 reduce 函式並使用兩個指標來獲取每個專案的 position。這些指標分別命名為 prevItem 和 currentItem。如果 prevItem 與 currentItem 相同,則將它們新增到子陣列中,否則新增到新陣列中。

步驟 3:現在將所有值以物件的形式放入,並將新建立的陣列分配給 sameObjToArray 變數。

步驟 4:對所有重複元素進行分組後,返回結果並使用控制檯顯示輸出。

示例

//Define array of duplicate elements in it
const arrayData = [2,3,8,9,2,3,5,4,8,9,2,3,7,5];

//define a variable to check same items
const sameObj = arrayData.reduce(
   (prevItem, currentItem) => ({
     ...prevItem,
     [currentItem]: [...(prevItem[currentItem] || []), currentItem],
   }),
   {}
  );
  
const sameObjToArray = Object.values(sameObj);

// console the output
console.log("After grouping identical elements");
console.log(sameObjToArray);

輸出

After grouping identical elements
[ [ 2, 2, 2 ], [ 3, 3, 3 ], [ 4 ], [ 5, 5 ], [ 7 ], [ 8, 8 ], [ 9, 9 ] ]

演算法 - 第二種方法

步驟 1:在給定的問題中,我們將檢查陣列的重複元素並在單個數組中對它們進行分組,因此為了實現此問題陳述,我們將遵循一些準則。首先,我們將建立一個函式來檢查相同的元素並將陣列作為引數傳遞。

步驟 2:如果提供的陣列尚未排序,則必須首先使用 sort() 方法對其進行排序。在此步驟中,我們將提供的陣列按升序排序。放置順序後,分組將變得簡單,然後您可以將專案放入新陣列中。

步驟 3:如前幾個步驟中所述,陣列現在已排序。為了構建子陣列,我們需要原始陣列元件的空陣列。並因此賦予其名稱。

步驟 4:在步驟 1、2 和 3 之後,下一步是迭代輸入陣列的所有元素,因此我們將使用陣列的長度初始化一個 for 迴圈。

步驟 5:在 for 迴圈中,檢查元素的值,如果它們相同,則將其推入同一個子陣列中。否則將其推入新子陣列中。

步驟 6:在此步驟中,宣告我們必須在上述函式中傳遞的輸入陣列資料。

步驟 7:在最後一步中,宣告另一個變數以呼叫上述函式並在其中傳遞一個宣告的陣列。並列印結果,在控制檯中輸出結果。

示例

// define a function to check duplicate numbers
function groupDuplicateNumbers(array) {
  array.sort((a, b) => a - b); 

  // declare empty array
  const result = [[]]; 

 // initialize a for loop to iterate all the elements
  for (let i = 0; i < array.length; i++) {
   // if-else condition to check elements are same
   if (array[i] === array[i-1]) {
     result[result.length - 1].push(array[i]); 
   } else {
     result.push([array[i]]); 
   }
  }

  return result.slice(1); 
}

//define array and call function
const array =  [151,221,330,151,221,330,414,202,202,414];
const finalGroup = groupDuplicateNumbers(array); 
console.log("The group of identical items in array:")
console.log(finalGroup); 

輸出

The group of identical items in array:
[
  [ 151, 151 ],
  [ 202, 202 ],
  [ 221, 221 ],
  [ 330, 330 ],
  [ 414, 414 ]
]

複雜度

要計算複雜度,我們必須檢查陣列大小和函式。因此,在我們的程式中,我們使用了一個包含 n 個元素的陣列,並且有一個 sameObj 函式,它正在迭代所有專案並檢查它們的出現次數。在檢查重複項後,我們將其放入子陣列中以建立子陣列的新陣列組合。因此,基本上,此程式完成執行所需的時間為 O(n),因為陣列包含 n 個元素。

結論

因此,在解決此問題後,我們學習瞭如何刪除或分離陣列的重複元素。因此,此方法將減少資料的冗餘,並減少儲存資料的記憶體空間。最後,我們得出結論,此演算法的時間複雜度為 O(n)。

更新於: 2023年8月18日

1K+ 閱讀量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.