JavaScript陣列右旋演算法程式


陣列右旋是指將陣列元素向右旋轉給定次數。對於位於邊緣的數字,假設陣列呈環狀,它們將移動到右旋後的第一個索引。我們將實現一個完整的程式碼來實現該演算法並進行解釋。

示例

Let us assume we have given array as
[1, 2, 3, 4, 5, 6, 7, 8, 9]
The number of right rotations of the array is 3
Output:
7 8 9 1 2 3 4 5 6 

解釋

第一次旋轉時,所有元素都向右移動,最後一個元素將移到第零個索引。

9 1 2 3 4 5 6 7 8

第二次旋轉時,所有元素再次移到下一個索引,最後一個元素移到第零個索引。

8 9 1 2 3 4 5 6 7

最終,經過第三次旋轉後,陣列如下所示

7 8 9 1 2 3 4 5 6

方法

我們已經看到了示例,現在讓我們來看一下實現程式碼的方法。但在介紹具體方法之前,讓我們先觀察一下。

對於示例,我們可以觀察到最後的k個元素已經到了前k個位置,而前(總數-k)個元素已經移到了最後位置。這意味著如果我們分別反轉最後的k個元素和剩餘的元素,然後反轉整個陣列,我們將得到結果陣列。所以,實現程式碼的步驟是:

  • 首先,我們將建立一個函式來反轉作為引數傳遞給它的陣列元素,並提供反轉的範圍。

  • 我們將簡單地遍歷給定陣列,從提供的起始和結束位置開始,交換當前索引的值,並將第一個指標向前移動一個位置,另一個指標向後移動一個位置。

  • 我們將建立一個函式,該函式將陣列和旋轉次數作為引數,首先獲取旋轉次數對陣列大小的模。

  • 之後,我們將三次呼叫反轉函式,傳遞陣列和範圍:

    • 最後的k個元素

    • 前(總數-k)個元素

    • 整個陣列。

  • 透過這種方式,陣列將向右旋轉給定次數,最後我們將列印它。

示例

// 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 get the mod and call another function 
function right_rotate(arr, k) {
   var len = arr.length 
   if (k == 0) return arr;
   // if rotations array 
   k = k % len;
   arr = revArray(arr, 0, (len-k-1));
   arr = revArray(arr, len-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, 2, 3, 4, 5, 6, 7, 8, 9];
var number_of_rotations = 3
console.log("The given array is: ");
print(arr);
console.log("The Array after " +number_of_rotations+ " rotations is: ")
arr = right_rotate(arr, number_of_rotations);
print(arr);

時間和空間複雜度

上述程式碼的時間複雜度為O(N),其中N是陣列的大小。我們遍歷陣列兩次,導致線性時間複雜度。

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

結論

在本教程中,我們實現了一個JavaScript程式,用於將給定陣列的元素向右旋轉給定次數。我們實現了反轉演算法,首先反轉前(長度-給定次數)個元素,然後反轉剩餘元素和所有元素。上述程式碼的時間複雜度為線性,空間複雜度為常數。

更新於:2023年4月12日

168 次瀏覽

開啟你的職業生涯

完成課程獲得認證

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