什么是数组旋转
数组旋转是指将数组中的元素按照一定规律进行移动的操作,通常包括两种操作:
左旋转
左旋转即将数组元素向左移动k个位置。比如,将数组[1,2,3,4,5,6,7]左旋转3个位置后得到[4,5,6,7,1,2,3]。
右旋转
右旋转即将数组元素向右移动k个位置。比如,将数组[1,2,3,4,5,6,7]右旋转3个位置后得到[5,6,7,1,2,3,4]。
数组旋转的C程序
下面是一个数组左旋转的C程序:
#include<stdio.h>
void leftRotate(int arr[], int d, int n)
{
int i, j, temp;
for(i = 0; i < gcd(d, n); i++)
{
temp = arr[i];
j = i;
while(1){
int k = j + d;
if(k >= n)
k = k - n;
if(k == i)
break;
arr[j] = arr[k];
j = k;
}
arr[j] = temp;
}
}
int gcd(int a,int b)
{
if(b==0)
return a;
else
return gcd(b,a%b);
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
int d = 2;
leftRotate(arr, d, n);
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
程序解释
这个C程序实现了一个数组左旋转的功能,采用的是辗转相除法求最大公因数。下面来解释一下程序的细节:
leftRotate函数
这个函数实现了数组左旋转的功能,需要传入三个参数:
arr: 需要进行旋转的数组
d: 旋转的位数
n: 数组的长度
函数首先会求出最大公因数g,然后通过外部循环遍历g个数,内部循环进行交换。
gcd函数
这个函数实现了求最大公因数的功能。
a: 第一个数
b: 第二个数
函数采用递归的方式实现辗转相除法,当第二个数为0时,返回第一个数,否则返回gcd(b, a%b)。
程序输出
上述C程序的输出结果是:
3 4 5 6 7 1 2
数组右旋转的C程序
下面是一个数组右旋转的C程序:
#include<stdio.h>
void rightRotate(int arr[], int d, int n)
{
int temp[d], i, j;
for(i = 0; i < d; i++)
temp[i] = arr[n-d+i];
for(i = n-1; i >= d; i--)
arr[i] = arr[i-d];
for(i = 0; i < d; i++)
arr[i] = temp[i];
}
int main()
{
int arr[] = {1, 2, 3, 4, 5, 6, 7};
int n = sizeof(arr) / sizeof(arr[0]);
int d = 2;
rightRotate(arr, d, n);
for (int i = 0; i < n; i++)
printf("%d ", arr[i]);
return 0;
}
程序解释
这个C程序实现了一个数组右旋转的功能,采用的是暴力方法,将要右移的d个数暂存到临时数组里面,再把原数组后面的n-d个数往后挪d个位置,最后再把临时数组中的d个数拷贝到原数组前d个位置。
rightRotate函数
这个函数实现了数组右旋转的功能,需要传入三个参数:
arr: 需要进行旋转的数组
d: 旋转的位数
n: 数组的长度
首先将要右移的d个数暂存到临时数组中,然后把原数组后面的n-d个数往后挪d个位置,最后再把临时数组中的d个数拷贝到原数组前d个位置。
程序输出
上述C程序的输出结果是:
6 7 1 2 3 4 5
总结
数组旋转是一个常见的操作,在开发中经常会遇到需求。本文介绍了两种数组旋转的实现方式,左旋转使用了辗转相除法求最大公因数,右旋转采用了暴力方法。两种方法均可实现数组旋转的功能,读者可以根据实际需求选择不同的方法。