使用反轉演算法進行陣列旋轉的JavaScript程式


陣列是一種線性資料結構,用於儲存不同型別的物件。我們得到一個大小為n的陣列和一個整數k(k是我們將陣列旋轉的次數)。我們將陣列旋轉k個元素,然後返回旋轉後的陣列。

旋轉意味著我們必須從給定的第k個元素遍歷陣列,並將所有整數向後移動一位,我們必須將每個元素向後移動一位,直到第k個元素到達位置“0”或索引號“0”。

注意 - 在旋轉時,當我們將所有元素向後移動一位時,每當它到達最後一個索引時,它的值就會移到索引0,索引0的值移到索引1,依此類推。

讓我們來看一個例子:

Input:
n = 5
array = [1, 2, 3, 4, 5]
k = 2;
Output:
Rotated array = [3, 4, 5, 1, 2]

注意 - 在上面的例子中,假設k小於或等於n。透過執行k = k% n,我們可以很容易地更改答案以處理更大的k值。

方法

為了解決這個問題,我們將遵循以下步驟:

  • 首先,我們將陣列分成兩部分。第一部分是從索引零到索引k-1,第二部分是從索引k到索引n-1。

    f = array[0…k-1] 和 s = array[k..n-1]

  • 我們有一個名為reverse的函式,我們必須將上述fs陣列傳遞給它以獲得“sf”陣列。

  • 我們演算法的主要部分是:

    反轉陣列“f”得到“rfs”(rf表示f的反轉陣列),

    反轉陣列“s”得到“rfrs”(rs表示s的反轉陣列),

    反轉陣列“rfrs”得到“sf”。

  • 最後,我們將列印旋轉k個元素後的陣列。

示例

n = 5
array = [1, 2, 3, 4 ,5]
k = 2
f = [1, 2]  and s = [3, 4, 5]
Reverse f, to get ‘rfs’ = [2, 1, 3, 4, 5]
Reverse s to get ‘rfrs’ = [2, 1, 5, 4, 3]
Reverse ‘rfrs’ to get ‘sf’ = [3, 4, 5, 1, 2]

示例

讓我們看看實現上述步驟的完整程式碼,以便更好地理解。

// Function to reverse array elements 
function revArray(arr, Left, Right) {
   while (Left < Right) {
      var temp = arr[Left];
      arr[Left] = arr[Right];
      arr[Right] = temp;
      Right--;
      Left++;
   }
   return arr;
}
// function to getting the mod and calling another function 
function left_rotate(arr, k) {
   var len = arr.length 
   if (k == 0) return arr;
   // if rotations array 
   k = k % len;
   arr = revArray(arr, 0, k-1);
   arr = revArray(arr, k, len-1);
   arr = revArray(arr, 0, len-1);
   return arr;
}
// Function to print elements of array 
function print(arr){
   var len = arr.length
   // traversing over the array 
   var temp = "";
   for (var i = 0; i < len; i++) {
      temp += arr[i];
      temp += " ";
   }
   console.log(temp)
}
// defining array 
var arr = [1, 5, 7, 8, 2, 2, 6, 9, 1, 5, 2];
var number_of_rotations = 3
console.log("The given array is: ");
print(arr);
console.log("The Array after " + number_of_rotations +" rotations is: ")
arr = left_rotate(arr, number_of_rotations);
print(arr);

時間和空間複雜度

上面程式碼的時間複雜度為O(N),其中N是陣列的大小,因為我們只遍歷了陣列一次。

上面程式碼的空間複雜度為O(1),因為我們沒有使用任何額外的空間來儲存任何東西。

結論

在本教程中,我們實現了一個JavaScript程式,使用反轉演算法將陣列旋轉k個元素。我們遍歷了大小為n的陣列,在reverse函式中反轉了陣列,並列印了旋轉後的陣列。上面程式碼的時間複雜度為O(N),空間複雜度為O(1)。

更新於:2023年4月12日

瀏覽量:182

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告