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程式,用於將給定陣列的元素向右旋轉給定次數。我們實現了反轉演算法,首先反轉前(長度-給定次數)個元素,然後反轉剩餘元素和所有元素。上述程式碼的時間複雜度為線性,空間複雜度為常數。
資料結構
網路
關係型資料庫管理系統 (RDBMS)
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP