题目:
Qestion: 设计一个算法 , 将含有 n 个元素的整数数组 A [ 0 … n − 1 ] 的元素循环右移 ( 1 ≤ m < n ) 位。要求算法的空间复杂度为 O ( 1 ) 设计一个算法,将含有n个元素的整数数组A[0…n-1]的元素循环右移(1≤m<n)位。要求算法的空间复杂度为O(1) 设计一个算法,将含有n个元素的整数数组A[0…n−1]的元素循环右移(1≤m<n)位。要求算法的空间复杂度为O(1)
主要思路:
- 输入右移的次数。
- 对右移的次数进行取模(假如共有5个元素,向右6移动6次就等于向右移动1次)。
- 设右移的次数为m,则先将前n – m 个元素转置。假如我共有五个元素(1,2,3,4,5),右移两位,则该步骤将转换为(3,2,1,4,5)。
- 再将最后m位进行转置。(3,2,1,5,4)
- 最后将整个数组进行转置。(4,5,1,2,3)
完整代码
#include <stdio.h>
void reverse(int a[], int l, int r){
int temp;
while (r > l)
{
temp = a[l];
a[l] = a[r];
a[r] = temp;
r--;
l++;
}
}
void move(int a[], int m, int n){ // m为右移的次数,n为数组元素的个数
if (n % m == 0)
{
return;
}
else
{
m = m % n;
}
reverse(a, 0, n-m-1); // 将数组的第0位到第n-m-1位进行转置
reverse(a, n-m, n-1); // 将数组的第n-m位到最后一位进行转置
reverse(a, 0, n-1); // 将这个数组进行转置
}
int main(){
int array[5] = {1,2,3,4,5};
int m; // 需要右移的次数
printf("右移前的数组为");
for(int i = 0; i < 5; i++){
printf("%d",array[i]);
}
printf("\n");
printf("请输入需要向右移动多少位\n");
scanf("%d",&m);
move(array, m, 5);
printf("右移后的数组为\n");
for(int i = 0; i < 5; i++){
printf("%d",array[i]);
}
return 0;
}
代码图片
结束语
因为是算法小菜,所以提供的方法和思路可能不是很好,请多多包涵~如果有疑问欢迎大家留言讨论,你如果觉得这篇文章对你有帮助可以给我一个免费的赞吗?我们之间的交流是我最大的动力!