您的位置:首页 > 其它

第 2 章 第 3 题 数组旋转问题 翻转算法实现

2014-04-01 21:08 260 查看
问题分析

  输入:目标数组,旋转位数。

  处理:将目标数组旋转指定的位数。

  约束:无

解答思路

  将对象数组拆分成 a b 两个部分:a 表示要移动到尾端的部分 b表示要移动到前端的部分。

  根据翻转算法的思想,可以按如下步骤完成旋转操作:

  1. 将 a 部分逆置

  2. 将 b 部分逆置

  3. 将整个数组逆置

代码实现

#include <iostream>

using namespace std;

// 数组旋转函数
void rotate(int *array, int n, int r);
// 逆置函数
void reverse(int *array, int n);

int main(void)
{
// 建立并初始化,输出测试数组。
int array[10];
int n=10;
for (int i=0; i<10; i++) {
array[i] = i+1;
}
cout << "目标数组:" << endl;
for (int i=0; i<10; i++) {
cout << array[i] << " ";
}
cout << endl;

// 获取旋转位数
int r;
cout << "旋转位数:";
cin >> r;

// 处理旋转位数
if (r<0) {
cout << "非法的旋转位数" << endl;
return 0;
}
else
r %= n;

// 调用数组旋转函数
rotate(array, n, r);

// 打印旋转结果
cout << endl << "旋转后的数组:" << endl;
for (int i=0; i<10; i++) {
cout << array[i] << " ";
}
cout << endl;

return 0;
}

void rotate(int *array, int n, int r) {
// 翻转 a 部分
reverse(array, r);
// 翻转 b 部分
reverse(array+r, n-r);
// 翻转对象数组
reverse(array, n);
}

void reverse(int *array, int n) {
int tem = 0;
for (int i=0; i<=(n-1)/2; i++) {
tem = array[i];
array[i] = array[n-i-1];
array[n-i-1] = tem;
}
}


小结

  这是数组翻转操作中最经典最常用的一个算法,应熟练掌握之。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐