您的位置:首页 > 其它

将数组的后面m个数移动为前面m个数

2016-06-18 21:50 232 查看
题目:如何将数组的后面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;
}


备注:递归逆序已经在字符串逆序(一)这篇博客中探讨过。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息