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个位置,而前total个元素减去k个元素已经移到了最后一个位置,这意味着如果我们分别反转最后k个元素和剩余元素,然后再反转整个数组,我们就能得到结果数组。因此,实现代码的步骤如下:
- 首先,我们将创建一个数组来反转传递给它作为参数和提供的范围以进行反转的数组的元素。
-
我们将简单地遍历给定的数组,从提供的第一个和最后一个位置开始,交换当前索引的值,并将第一个指针向前移动一步,另一个指针向后移动一步。
-
我们将创建一个函数,接受数组和旋转次数作为参数,首先我们将获取旋转次数与数组大小的模。
-
然后,我们将通过传递数组和范围来调用反转函数三次,范围为
- 最后k个元素
-
前total减去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程序,用于将给定数组的元素向右旋转指定次数。我们采用了反转算法,首先反转前面长度减去给定次数的元素,然后反转剩余的元素和所有元素。上述代码的时间复杂度是线性的,空间复杂度是常数。