个性化阅读
专注于IT技术分析

如何在Java中向左或向右旋转数组?

本文概述

给定一个大小为N,下标为D的数组arr[],任务是按下标D旋转该数组。

向左旋转:数组从左向右旋转D元素

例子:

输入:
arr[] = {1, 2, 3, 4, 5}
D = 2
输出:3 4 5 1 2
说明:
初始数组[1, 2, 3, 4, 5]
旋转第一个索引[2, 3, 4, 5, 1]
旋转第二个索引[3, 4, 5, 1, 2]
输入:arr[] = {10, 34, 56, 23, 78, 12, 13, 65}
D = 7
输出:65 10 34 56 23 78 12 13

使用临时数组

方法:在此方法中, 只需创建一个临时数组并将数组arr[]的元素从0复制到Dth索引。移动之后, 将数组arr[]的其余元素从索引D移到N。然后将临时数组元素移至原始数组。

输入arr[] = [1、2、3、4、5], D = 2
1)将前d个元素存储在temp数组中:temp [] = [1, 2]
2)移位arr[]的其余部分:arr[] = [3, 4, 5]
3)存储回D个元素:arr[] = [3, 4, 5, 1, 2]

下面是上述方法的实现:

//Java program to left rotate
//an array by D elements
  
class GFG {
  
     //Function to left rotate arr[]
     //of size N by D
     void leftRotate( int arr[], int d, int n)
     {
         //create temp array of size d
         int temp[] = new int [d];
  
         //copy first d element in array temp
         for ( int i = 0 ; i <d; i++)
             temp[i] = arr[i];
  
         //move the rest element to index
         //zero to N-d
         for ( int i = d; i <n; i++) {
             arr[i - d] = arr[i];
         }
  
         //copy the temp array element
         //in origninal array
         for ( int i = 0 ; i <d; i++) {
             arr[i + n - d] = temp[i];
         }
     }
  
     //utility function to print an array
     void printArray( int arr[], int n)
     {
         for ( int i = 0 ; i <n; i++)
             System.out.print(arr[i] + " " );
     }
  
     //Driver program to test above functions
     public static void main(String[] args)
     {
         GFG rotate = new GFG();
         int arr[] = { 1 , 2 , 3 , 4 , 5 };
         rotate.leftRotate(arr, 2 , arr.length);
         rotate.printArray(arr, arr.length);
     }
}

输出如下:

3 4 5 1 2

时间复杂度:O(N)

辅助空间:O(D)

一张一张地旋转:

方法:逐一递归旋转数组-

输入arr[] = [1、2、3、4、5], D = 2
1)将arr[0]交换为arr[1]
2)将arr[1]交换为arr[2]



3)将arr[N-1]交换为arr[N]
4)重复1、2、3至D次

要旋转一个, 将arr[0]存储在临时变量temp中, 将arr[1]移至arr[0], 将arr[2]移至arr[1]…最后将temp移至arr[n-1]

让我们以相同的示例arr[] = [1、2、3、4、5], d = 2
将arr[]旋转2倍
在第一次旋转后得到[2、3、4、5、1] [3, 4, 5, 1, 2]在第二次旋转后。

下面是上述方法的实现:

//Java program to left rotate
//an array by d elements
  
class GFG {
  
     //Function to left rotate arr[]
     //of size n by d
     void leftRotate( int arr[], int d, int n)
     {
         for ( int i = 0 ; i <d; i++)
             leftRotatebyOne(arr, n);
     }
  
     void leftRotatebyOne( int arr[], int n)
     {
         int i, temp;
         temp = arr[ 0 ];
         for (i = 0 ; i <n - 1 ; i++)
             arr[i] = arr[i + 1 ];
         arr[i] = temp;
     }
  
     //utility function to print an array
     void printArray( int arr[], int n)
     {
         for ( int i = 0 ; i <n; i++)
             System.out.print(arr[i] + " " );
     }
  
     //Driver program to test above functions
     public static void main(String[] args)
     {
         GFG rotate = new GFG();
         int arr[] = { 1 , 2 , 3 , 4 , 5 };
         rotate.leftRotate(arr, 2 , arr.length);
         rotate.printArray(arr, arr.length);
     }
}

输出如下:

3 4 5 1 2

时间复杂度:O(N * D)

辅助空间:O(1)

一个调度算法:

方法:这是方法2的扩展。不是将数组逐个移动, 而是将数组划分为不同的集合, 其中集合的数量等于n和d的GCD并在集合内移动元素。

如果上述示例数组的GCD原样为1(n = 5和d = 2), 则元素将仅在一组内移动, 我们仅从temp = arr[0]开始并继续移动arr[I + d ]到arr[I], 最后将温度存储在正确的位置。

下面是上述方法的实现:

//Java program to left rotate
//an array by d elements
  
class GFG {
  
     //Function to left rotate arr[]
     //of siz N by D
     void leftRotate( int arr[], int d, int n)
     {
         //To handle if d>= n
         d = d % n;
         int i, j, k, temp;
         int g_c_d = gcd(d, n);
  
         for (i = 0 ; i <g_c_d; i++) {
  
             //move i-th values of blocks
             temp = arr[i];
             j = i;
             while ( true ) {
                 k = j + d;
                 if (k>= n)
                     k = k - n;
                 if (k == i)
                     break ;
                 arr[j] = arr[k];
                 j = k;
             }
             arr[j] = temp;
         }
     }
  
     //function to print an array
     void printArray( int arr[], int size)
     {
         int i;
         for (i = 0 ; i <size; i++)
             System.out.print(arr[i] + " " );
     }
  
     //Function to get gcd of a and b
     int gcd( int a, int b)
     {
         if (b == 0 )
             return a;
         else
             return gcd(b, a % b);
     }
  
     //Driver program to test above functions
     public static void main(String[] args)
     {
         GFG rotate = new GFG();
         int arr[] = { 1 , 2 , 3 , 4 , 5 };
         rotate.leftRotate(arr, 2 , arr.length);
         rotate.printArray(arr, arr.length);
     }
}

输出如下:

3 4 5 1 2

时间复杂度:O(N)

辅助空间:O(1)

向右旋转:数组从右向右旋转D元素

例子:

输入:arr[] = {1, 2, 3, 4, 5}
D = 2
输出:4 5 1 2 3
说明:初始数组[1, 2, 3, 4, 5]
旋转第一个索引[2, 3] 、、 4、5、1]
旋转第二个索引[3、4、5、1、2]
旋转第三索引[4、5、1、2、3]
输入:arr[] = {10, 34, 56, 23, 78, 12, 13, 65} D = 5
输出:56 23 78 12 13 65 10 34

使用临时数组

方法:在此方法中, 只需创建一个临时数组, 然后将数组arr[]的元素从0复制到N – D索引。移动之后, 将数组arr[]的其余元素从索引D移到N。然后将临时数组元素移至原始数组。

Input arr[] = [1, 2, 3, 4, 5], D = 2
1) Store the first d elements in a temp array
   temp[] = [1, 2, 3]
2) Shift rest of the arr[]
   arr[] = [4, 5]
3) Store back the D elements
   arr[] = [4, 5, 1, 2, 3]

下面是上述方法的实现:

//Java program to rotate an array by
//D elements
  
class GFG {
     //Function to right rotate arr[]
     //of size N by D
  
     void rightRotate( int arr[], int d, int n)
     {
         //create temp array of size d
         int temp[] = new int [n - d];
  
         //copy first N-D element in array temp
         for ( int i = 0 ; i <n - d; i++)
             temp[i] = arr[i];
  
         //move the rest element to index
         //zero to D
         for ( int i = n - d; i <n; i++) {
             arr[i - d - 1 ] = arr[i];
         }
  
         //copy the temp array element
         //in origninal array
         for ( int i = 0 ; i <n - d; i++) {
             arr[i + d] = temp[i];
         }
     }
  
     //utility function to print an array
     void printArray( int arr[], int n)
     {
         for ( int i = 0 ; i <n; i++)
             System.out.print(arr[i] + " " );
     }
  
     //Driver program to test above functions
     public static void main(String[] args)
     {
         GFG rotate = new GFG();
         int arr[] = { 1 , 2 , 3 , 4 , 5 };
         rotate.rightRotate(arr, 2 , arr.length);
         rotate.printArray(arr, arr.length);
     }
}

输出如下:

4 5 1 2 3

时间复杂度:O(N)

辅助空间:O(D)

一张一张地旋转:

方法:逐一递归旋转数组-

输入arr[] = [1、2、3、4、5], D = 2
1)将arr[N]交换为arr[N-1]
2)将arr[N-1]交换为arr[N-2]
。 。 。
3)将arr[2]交换为arr[1]
4)重复1、2、3至D次

要旋转一个, 将arr[N]存储在临时变量temp中, 将arr[N-1]移至arr[N], 将arr[N-2]移至arr[N-1]…最后将temp移至arr[1 ]

让我们以相同的示例为例, arr[] = [1, 2, 3, 4, 5], d = 2将arr[]旋转2倍第一次旋转后得到[5, 1, 2, 3, 4], [4、5、1、2、3]在第二次旋转后。

下面是上述方法的实现:

//Java program to rotate an array by
//d elements
  
class GFG {
  
     //Function to right rotate arr[]
     //of size n by d
     void rightRotate( int arr[], int d, int n)
     {
         for ( int i = n; i> d; i--)
             rightRotatebyOne(arr, n);
     }
  
     void rightRotatebyOne( int arr[], int n)
     {
         int i, temp;
         temp = arr[ 0 ];
         for (i = 0 ; i <n - 1 ; i++)
             arr[i] = arr[i + 1 ];
         arr[i] = temp;
     }
  
     //utility function to print an array
     void printArray( int arr[], int n)
     {
         for ( int i = 0 ; i <n; i++)
             System.out.print(arr[i] + " " );
     }
  
     //Driver program to test above functions
     public static void main(String[] args)
     {
         GFG rotate = new GFG();
         int arr[] = { 1 , 2 , 3 , 4 , 5 };
         rotate.rightRotate(arr, 2 , arr.length);
         rotate.printArray(arr, arr.length);
     }
}

输出如下:

4 5 1 2 3

时间复杂度:O(N * D)

辅助空间:O(1)

一个调度算法:

方法:这是方法2的扩展。不是将数组一个接一个地移动, 而是将数组划分为不同的集合, 其中集合的数量等于n和d的GCD并在集合内移动元素。

如果对于上述示例数组(n = 5和d = 2)GCD原样为1, 则元素将仅在一组内移动, 我们仅从temp = arr[N]开始并继续移动arr[I + d ]到arr[I], 最后将温度存储在正确的位置。

下面是上述方法的实现:

//Java program to rotate an array by
//d elements
  
class GFG {
  
     //Function to right rotate arr[]
     //of siz N by D
     void rightRotate( int arr[], int d, int n)
     {
  
         //to use as left rotation
         d = n - d;
         d = d % n;
         int i, j, k, temp;
         int g_c_d = gcd(d, n);
         for (i = 0 ; i <g_c_d; i++) {
  
             //move i-th values of blocks
             temp = arr[i];
             j = i;
             while ( true ) {
                 k = j + d;
                 if (k>= n)
                     k = k - n;
                 if (k == i)
                     break ;
                 arr[j] = arr[k];
                 j = k;
             }
             arr[j] = temp;
         }
     }
  
     //UTILITY FUNCTIONS
  
     //function to print an array
     void printArray( int arr[], int size)
     {
         int i;
         for (i = 0 ; i <size; i++)
             System.out.print(arr[i] + " " );
     }
  
     //Function to get gcd of a and b
     int gcd( int a, int b)
     {
         if (b == 0 )
             return a;
         else
             return gcd(b, a % b);
     }
  
     //Driver program to test above functions
     public static void main(String[] args)
     {
         GFG rotate = new GFG();
         int arr[] = { 1 , 2 , 3 , 4 , 5 };
         rotate.rightRotate(arr, 2 , arr.length);
         rotate.printArray(arr, arr.length);
     }
}

输出如下:

4 5 1 2 3

时间复杂度:O(N)

辅助空间:O(1)


赞(0) 打赏
未经允许不得转载:srcmini » 如何在Java中向左或向右旋转数组?
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者

微信扫一扫打赏