使用反转算法进行数组旋转的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的数组,在reverse函数中反转了数组,并打印了旋转后的数组。上面代码的时间复杂度为O(N),空间复杂度为O(1)。
广告