JavaScript陣列中每n個元素一組求平均值


給定問題要求找出陣列中每n個元素一組的平均值。如果陣列中有m個元素,則計算每組的平均值,並以陣列形式顯示結果。

理解問題

假設陣列中有6個元素,每組2個元素。現在分別計算每組的平均值。現在我們有了它們的平均值,可以將它們組合成一個數組。

為了實現這個問題,我們使用了reduce()、push()和slice()。這些是javascript中的預定義方法。

reduce()函式將對陣列的每個元素執行一個reducer函式,並給出一個單一的輸出值。reduce()函式的語法如下:

 array.reduce(callbackFunction(currentValue, currentIndex), initialValue)

push()函式用於將所有元素推入陣列。它在最後一個索引處向陣列新增一個新項。它還會更改陣列的大小。“push()”的語法如下:

輸入

colors = ["Red", "Blue", "Black"];
colors.push("Pink","Grey");

輸出

[ 'Red', 'Blue', 'Black', 'Pink', 'Grey' ]

slice()函式透過切片從陣列中返回選定的項作為新陣列。此函式的機制是從指定的起點到終點選擇元素。此函式的特性是它不會更改實際陣列。語法如下:

輸入

colors = ["Red", "Blue", "Black", "Pink", "Grey"];
color = colors.slice(1,3);

輸出

[ 'Blue', 'Black' ]

演算法 - 使用slice、reduce和push函式

步驟1:為了解決這個問題,宣告一個名為groupAverage的函式,該函式接收一個整數陣列作為輸入。

步驟2:宣告函式後,我們需要宣告一個數組來儲存元素,並將其命名為result,值為0(初始化為空)。

步驟3:使用for迴圈遍歷每個整數元素,直到array.length。

步驟4:這是我們將建立元素組並將它們分配給batch變數的主要步驟。

步驟5:此步驟將確定我們建立的每組的平均值。為此,我們將新增每組的組成部分,計算它們的平均值,並將avg變數賦值。

步驟6:現在,在這個步驟中,計算出的平均值將被新增到或推入result陣列中。

步驟7:給出計算每組平均值後的結果。獲得平均值後,我們需要將它們推入一個新陣列。因此,結果將是陣列的陣列。

示例

//Define a function to calculate average
function groupAverage (a, n) {
  var result = [];

  for (let i = 0; i < a.length; i =i+n) {
   var batch = a.slice(i, i + n);
   var avg = batch.reduce((sum, b) => sum + b, 0) / batch.length;
   result.push(avg);
  }

  return result;
}
//Define array and number to calculate average of groups
var arr = [11, 21, 31, 41, 51, 61, 71, 81, 91];
var num = 3;

// Calling the function and store it in result
var output = groupAverage(arr, num);
console.log("Average of every group of n elements in an array")
console.log(output); 

輸出

Average of every group of n elements in an array
[ 21, 51, 81 ]

在上面的程式碼中,我們定義了一個名為groupAverage()的函式,它接受兩個引數:一個數組'a'和一個數字'n'。使用for迴圈迭代陣列的元素,每步增加n。

在迴圈內,將陣列從當前索引切片到前面n個元素,並將結果新增到名為group的變數中。透過對group呼叫javascript函式reduce()併除以其長度來計算group的平均值,並將結果賦值給名為avg的變數。現在將avg值推入result陣列。然後返回並顯示函式的結果。

演算法 - 使用兩個for迴圈

步驟1:第一步,定義包含一些值的陣列。

步驟2:建立一個函式並命名為groupAvg()。該函式接受兩個引數陣列和num。其中num是單個組中元素的數量,陣列是我們第一步中定義的變數。

步驟3:第二步之後,定義一個數組來儲存結果。

步驟4:定義一個for迴圈,直到陣列的長度。還初始化一個sum變數,初始值為0。

步驟5:在此步驟中,宣告另一個for迴圈,它將迭代組元素。

步驟6:在此階段確定該值是否為數字。如果沒有數值,則將預設值設定為0。

步驟7:在result陣列中,新增各個組的平均值。

步驟8:最後一步,列印輸出並返回result的值。

示例

//Declare an array with name array
const array = [2, 1, 5, 4, 1, 3, 6, 7, 9];

//Function to calculate Average of groups 
function groupAvg(array, num) {
  var result = [];
  for (let i = 0; i < array.length;) {
   var sum = 0;
   for(let j = 0; j< num; j++){
     sum += +array[i++] || 0
   }
   result.push(sum/num);
  }
  return result
}

console.log("Group average for 3 and 2 items respectively: ")
console.log(groupAvg(array, 3)) 
console.log(groupAvg(array, 2)) 

輸出

Group average for 3 and 2 items respectively: 
[ 2.666666666665, 2.666666666666665, 7.33333333333333 ]
[ 1.5, 4.5, 2, 6.5, 4.5 ]

複雜度

從上面的實現中可以看出,我們使用了for迴圈來實現預期的結果。現在我們發現groupCount()只適用於物件中存在的專案數量。那麼時間複雜度為O(n)。其中n代表輸入資料的大小。此外,由於總函式在group物件中為每個堆疊保留一個計數值,因此程式需要相同數量的記憶體,O(n)。

結論

此演算法提供了關於slice()、reduce()和push()函式用法的基本思路。此演算法的時間複雜度為O(N)。透過這個問題,我們將瞭解如何切片和計算陣列中分組元素的平均值。這就是我們如何解決給定問題的方法。它將以較低的時間複雜度和空間複雜度來提高邏輯思維和編碼能力。

更新於:2023年8月18日

862 次瀏覽

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.