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