问题:有n个整数,使前面各数顺序向后移m个位置,最后m个数变成最前面m个数,见下图,写一函数实现以上功能,在主函数中输入n个整数和输出调整后的n个数。
假设现有一个数组arr[] = {1,2,3,4,5},n = 5,m = 2,最终结果为3 4 5 1 2.
思路:
1.整体逆序 5 4 3 2 1
调用Swap交换函数 1 5 交换;2 4交换;3不动
2.区间逆转
在5 4 3 区间内 0 ~ n-m-1
在1 2 区间内 n-m ~ n-1
具体代码如下:
#includevoid Swap(int* p,int* q) { int temp = *p; *p = *q; *q = temp; } void Reverse(int* arr, int begin_index, int end_index) { int* p = arr + begin_index; int* q = arr + end_index; while (p < q) { Swap(p, q); p++; q--; } } void Adjust(int* arr, int len,int m) { Reverse(arr,0,len-1); //全部逆转 //区间逆转 Reverse(arr,0,len-m-1); Reverse(arr, len - m, len - 1); } int main() { int arr[] = {1,2,13,14}; Adjust(arr,4,2); for (int i = 0; i < 4; i++) { printf("%5d",arr[i]); } }
结果展示:
3 4 5 1 2



