在 O(n) 时间和 O(1) 空间中打印数组的左旋转
给定一个大小为 n 的数组和多个值,我们需要围绕该数组左旋。如何快速打印多个左旋转?
例子 :
Input :
arr[] = {1, 3, 5, 7, 9}
k1 = 1
k2 = 3
k3 = 4
k4 = 6
Output :
3 5 7 9 1
7 9 1 3 5
9 1 3 5 7
3 5 7 9 1
Input :
arr[] = {1, 3, 5, 7, 9}
k1 = 14
Output :
9 1 3 5 7
我们在下面的帖子中讨论了一个解决方案。
快速查找数组的多个左旋转 |设置 1
方法一:
上面讨论的解决方案需要额外的空间。在这篇文章中,讨论了一种不需要额外空间的优化解决方案。
C++
// C++ implementation of left rotation of
// an array K number of times
#include
using namespace std;
// Function to leftRotate array multiple times
void leftRotate(int arr[], int n, int k)
{
/* To get the starting point of rotated array */
int mod = k % n;
// Prints the rotated array from start position
for (int i = 0; i < n; i++)
cout << (arr[(mod + i) % n]) << " ";
cout << "\n";
}
// Driver Code
int main()
{
int arr[] = { 1, 3, 5, 7, 9 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
// Function Call
leftRotate(arr, n, k);
k = 3;
// Function Call
leftRotate(arr, n, k);
k = 4;
// Function Call
leftRotate(arr, n, k);
return 0;
}
Java
// JAVA implementation of left rotation
// of an array K number of times
import java.util.*;
import java.lang.*;
import java.io.*;
class arr_rot {
// Function to leftRotate array multiple
// times
static void leftRotate(int arr[], int n, int k)
{
/* To get the starting point of
rotated array */
int mod = k % n;
// Prints the rotated array from
// start position
for (int i = 0; i < n; ++i)
System.out.print(arr[(i + mod) % n] + " ");
System.out.println();
}
// Driver code
public static void main(String[] args)
{
int arr[] = { 1, 3, 5, 7, 9 };
int n = arr.length;
int k = 2;
// Function Call
leftRotate(arr, n, k);
k = 3;
// Function Call
leftRotate(arr, n, k);
k = 4;
// Function Call
leftRotate(arr, n, k);
}
}
// This code is contributed by Sanjal
Python
# Python implementation of left rotation of
# an array K number of times
# Function to leftRotate array multiple times
def leftRotate(arr, n, k):
# To get the starting point of rotated array
mod = k % n
s = ""
# Prints the rotated array from start position
for i in range(n):
print str(arr[(mod + i) % n]),
print
return
# Driver code
arr = [1, 3, 5, 7, 9]
n = len(arr)
k = 2
# Function Call
leftRotate(arr, n, k)
k = 3
# Function Call
leftRotate(arr, n, k)
k = 4
# Function Call
leftRotate(arr, n, k)
# This code is contributed by Sachin Bisht
C#
// C# implementation of left
// rotation of an array K
// number of times
using System;
class GFG {
// Function to leftRotate
// array multiple times
static void leftRotate(int[] arr, int n, int k)
{
// To get the starting
// point of rotated array
int mod = k % n;
// Prints the rotated array
// from start position
for (int i = 0; i < n; ++i)
Console.Write(arr[(i + mod) % n] + " ");
Console.WriteLine();
}
// Driver Code
static public void Main()
{
int[] arr = { 1, 3, 5, 7, 9 };
int n = arr.Length;
int k = 2;
// Function Call
leftRotate(arr, n, k);
k = 3;
// Function Call
leftRotate(arr, n, k);
k = 4;
// Function Call
leftRotate(arr, n, k);
}
}
// This code is contributed by m_kit
PHP
Javascript
C++
// C++ Implementation For Print Left Rotation Of Any Array K
// Times
#include
#include
using namespace std;
// Function For The k Times Left Rotation
void leftRotate(int arr[], int k, int n)
{
// Stl function rotates takes three parameters - the
// beginning,the position by which it should be rotated
// ,the end address of the array
// The below function will be rotating the array left
// in linear time (k%arraySize) times
rotate(arr, arr + (k % n), arr + n);
// Print the rotated array from start position
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << "\n";
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 7, 9 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
// Function Call
leftRotate(arr, k, n);
return 0;
}
Java
// Java implementation for print left
// rotation of any array K times
import java.io.*;
import java.util.*;
class GFG{
// Function for the k times left rotation
static void leftRotate(Integer arr[], int k,
int n)
{
// In Collection class rotate function
// takes two parameters - the name of
// array and the position by which it
// should be rotated
// The below function will be rotating
// the array left in linear time
// Collections.rotate()rotate the
// array from right hence n-k
Collections.rotate(Arrays.asList(arr), n - k);
// Print the rotated array from start position
for(int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
// Driver code
public static void main(String[] args)
{
Integer arr[] = { 1, 3, 5, 7, 9 };
int n = arr.length;
int k = 2;
// Function call
leftRotate(arr, k, n);
}
}
// This code is contributed by chahattekwani71
Python3
# Python3 implementation to print left
# rotation of any array K times
from collections import deque
# Function For The k Times Left Rotation
def leftRotate(arr, k, n):
# The collections module has deque class
# which provides the rotate(), which is
# inbuilt function to allow rotation
arr = deque(arr)
# using rotate() to left rotate by k
arr.rotate(-k)
arr = list(arr)
# Print the rotated array from
# start position
for i in range(n):
print(arr[i], end = " ")
# Driver Code
if __name__ == '__main__':
arr = [ 1, 3, 5, 7, 9 ]
n = len(arr)
k = 2
# Function Call
leftRotate(arr, k, n)
# This code is contributed by math_lover
C#
// C# program for the above approach
using System;
class GFG
{
static void leftRotate(int[] arr, int d,
int n)
{
for (int i = 0; i < d; i++)
leftRotatebyOne(arr, n);
}
static void leftRotatebyOne(int[] arr, int n)
{
int i, temp = arr[0];
for (i = 0; i < n - 1; i++)
arr[i] = arr[i + 1];
arr[n - 1] = temp;
}
/* utility function to print an array */
static void printArray(int[] arr, int size)
{
for (int i = 0; i < size; i++)
Console.Write(arr[i] + " ");
}
// Driver Code
public static void Main()
{
int[] arr = { 1, 3, 5, 7, 9 };
int n = arr.Length;
int k = 2;
// Function call
leftRotate(arr, k, n);
printArray(arr, n);
}
}
// This code is contributed by avijitmondal1998.
Javascript
输出
5 7 9 1 3
7 9 1 3 5
9 1 3 5 7
方法二:
在下面的实现中,我们将使用标准模板库 (STL),这将使解决方案更加优化和易于实现。
C++
// C++ Implementation For Print Left Rotation Of Any Array K
// Times
#include
#include
using namespace std;
// Function For The k Times Left Rotation
void leftRotate(int arr[], int k, int n)
{
// Stl function rotates takes three parameters - the
// beginning,the position by which it should be rotated
// ,the end address of the array
// The below function will be rotating the array left
// in linear time (k%arraySize) times
rotate(arr, arr + (k % n), arr + n);
// Print the rotated array from start position
for (int i = 0; i < n; i++)
cout << arr[i] << " ";
cout << "\n";
}
// Driver program
int main()
{
int arr[] = { 1, 3, 5, 7, 9 };
int n = sizeof(arr) / sizeof(arr[0]);
int k = 2;
// Function Call
leftRotate(arr, k, n);
return 0;
}
Java
// Java implementation for print left
// rotation of any array K times
import java.io.*;
import java.util.*;
class GFG{
// Function for the k times left rotation
static void leftRotate(Integer arr[], int k,
int n)
{
// In Collection class rotate function
// takes two parameters - the name of
// array and the position by which it
// should be rotated
// The below function will be rotating
// the array left in linear time
// Collections.rotate()rotate the
// array from right hence n-k
Collections.rotate(Arrays.asList(arr), n - k);
// Print the rotated array from start position
for(int i = 0; i < n; i++)
System.out.print(arr[i] + " ");
}
// Driver code
public static void main(String[] args)
{
Integer arr[] = { 1, 3, 5, 7, 9 };
int n = arr.length;
int k = 2;
// Function call
leftRotate(arr, k, n);
}
}
// This code is contributed by chahattekwani71
Python3
# Python3 implementation to print left
# rotation of any array K times
from collections import deque
# Function For The k Times Left Rotation
def leftRotate(arr, k, n):
# The collections module has deque class
# which provides the rotate(), which is
# inbuilt function to allow rotation
arr = deque(arr)
# using rotate() to left rotate by k
arr.rotate(-k)
arr = list(arr)
# Print the rotated array from
# start position
for i in range(n):
print(arr[i], end = " ")
# Driver Code
if __name__ == '__main__':
arr = [ 1, 3, 5, 7, 9 ]
n = len(arr)
k = 2
# Function Call
leftRotate(arr, k, n)
# This code is contributed by math_lover
C#
// C# program for the above approach
using System;
class GFG
{
static void leftRotate(int[] arr, int d,
int n)
{
for (int i = 0; i < d; i++)
leftRotatebyOne(arr, n);
}
static void leftRotatebyOne(int[] arr, int n)
{
int i, temp = arr[0];
for (i = 0; i < n - 1; i++)
arr[i] = arr[i + 1];
arr[n - 1] = temp;
}
/* utility function to print an array */
static void printArray(int[] arr, int size)
{
for (int i = 0; i < size; i++)
Console.Write(arr[i] + " ");
}
// Driver Code
public static void Main()
{
int[] arr = { 1, 3, 5, 7, 9 };
int n = arr.Length;
int k = 2;
// Function call
leftRotate(arr, k, n);
printArray(arr, n);
}
}
// This code is contributed by avijitmondal1998.
Javascript
输出
5 7 9 1 3
注意:数组本身在旋转后会更新。