题目描述
解题思路
本题方法较多,博主就讲一个做法。
首先题目要求是不能使用另一个数组。
我们每次都右移一个数字,在右移的开始前,先保存最右边的数字,然后进行覆盖,最后把保存的数字再覆盖给首元素,这是第一次右移。后面的每一次都是这样实现的,可以递归实现。
还有一个思路:1.全部逆序,2.前面n个逆序,剩余后面的逆序。
读者自己实现一下,用库函数更简单一些
代码
#include <stdio.h> #include <stdlib.h> #include <assert.h> void f(int* arr,int m,int n) { int temp = arr[m-1]; int i = 0; if (n == 0) return; for (i = m; i >0; i--)//从后往前覆盖 { arr[i-1] = arr[i -2]; } arr[0] = temp;//让最后一个回到第一个位置 f(arr, m, n-1);//下一次右移 } int main() { int m, n; scanf("%d%d", &m, &n); int* arr = (int*)malloc(m * sizeof(int)); assert(arr); int i = 0; for (i = 0; i < m; i++) { scanf("%d", arr + i); } f(arr,m, n); for (i = 0; i < m; i++) { printf("%d", arr[i]); if (i != m - 1) printf(" "); } free(arr); arr = NULL; return 0; }