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程序,用于将给定数组的元素向右旋转给定次数。我们实现了反转算法,首先反转前(长度-给定次数)个元素,然后反转剩余元素和所有元素。上述代码的时间复杂度为线性,空间复杂度为常数。