题目:如何将数组的后面m个数移动为前面m个数。
思路分析:
有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数。例如,有10个数的数组,即 n=10,它们的值分别是 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,如果取 m=5的话,经过位置调整后,变为 6, 7, 8, 9, 10, 1, 2, 3, 4, 5。
可以通过递归的方法实现调整:
(1)将前 m个元素的顺序颠倒。
(2)将后面 n - m 个元素的顺序颠倒。
(3)将 n 个元素的顺序全部颠倒。
通过以上三个步骤的执行,就可以把数组的元素颠倒。以上例而言,第一步以后,数组顺序变为:5, 4, 3, 2, 1, 6, 7, 8, 9, 10;第二步以后,数组顺序变为:5, 4, 3, 2, 1, 10, 9, 8, 7, 6;第三步以后,数组顺序变为:6, 7, 8, 9, 10, 1, 2, 3, 4, 5;正是题目要求的,此时结束运算。
#include <iostream>
using namespace std;
// 递归逆序
void Reverse(int *start, int *end)
{
while (start < end)
{
int temp = *start;
*start++ = *end;
*end-- = temp;
}
}
void Adjust(int *arr, int n, int m)
{
Reverse(arr,arr + m - 1); // 前m个数顺序颠倒
Reverse(arr + m, arr + n - 1); // 后n-m个数顺序颠倒
Reverse(arr, arr + n - 1); // 所有数顺序颠倒
}
int main(int argc, const char * argv[]) {
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int len = sizeof(arr)/sizeof(arr[0]);
Adjust(arr, len, 5);
for (int i = 0; i < len; i++)
cout << arr[i] << ' ';
cout << endl;
return 0;
}
备注:递归逆序已经在字符串逆序(一)这篇博客中探讨过。