一、问题描述:
有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数。比如原数组:
1 2 3 4 5 6 7(n=7,m=4)===>旋转后4 5 6 7 1 2 3
二、解题思路
- 第一步:先将数组前n-m个数逆置
- 第二部:再将数组剩下的m个数逆置
- 第三步:最后将数组整体逆置
三、代码实现
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
//4 . 有n个整数 使前面的各数顺序后移m个位置 最后m个数变成前面m个数
//交换两个数
void swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
//将数组low到high位置逆转
void reverse(int arr[], int low, int high) {
while (low <= high) {
swap(&arr[low], &arr[high]);
low++;
high--;
}
}
//将arr数组 向后顺序移动m位 后m位变成前m位
void fun(int arr[], int length, int m) {
//第一步
reverse(arr, 0, length - m - 1);
//第二步
reverse(arr, length - m, length - 1);
//第三步
reverse(arr, 0, length - 1);
}
void print(int arr[], int n) {
for (int i = 0; i < n; i++) {
printf("%d ", arr[i]);
}
}
int main()
{
int arr[100];
int n, m;//n个整数 m 需要顺序后移的偏移量
printf("请输入n的个数:\n");
scanf("%d", &n);
printf("请输入每个数:\n");
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
printf("请输入顺序后移的量m:\n");
scanf("%d", &m);
printf("目前的序列:\n");
print(arr, n);
fun(arr, n, m);//将arr数组 向后顺序移动m位 后m位变成前m位
printf("\n调整后的序列:\n");
print(arr, n);
return 0;
}