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的数组,并在反转函数中将数组反转并打印出旋转后的数组。上述代码的时间复杂度为O(N),空间复杂度为O(1)。