问题分析
输入:目标数组,旋转位数。
处理:将目标数组旋转指定的位数。
约束:无
解答思路
将对象数组拆分成 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; } }
小结
这是数组翻转操作中最经典最常用的一个算法,应熟练掌握之。