问题分析
输入:目标数组,旋转位数。
处理:将目标数组旋转指定的位数。
约束:无
解答思路
设数组长度 n,旋转位数 r。
首先将数组前 r 个元素暂存,然后将数组后面的 n-r 个元素移动到前端,最后将暂存的这 r 个元素填充到数组尾部。
代码实现
1 #include <iostream> 2 3 using namespace std; 4 5 // 数组旋转函数 6 void rotate(int *array, int n, int r); 7 8 int main(void) 9 { 10 // 建立并初始化,输出测试数组。 11 int array[10]; 12 int n=10; 13 for (int i=0; i<10; i++) { 14 array[i] = i+1; 15 } 16 cout << "目标数组:" << endl; 17 for (int i=0; i<10; i++) { 18 cout << array[i] << " "; 19 } 20 cout << endl; 21 22 // 获取旋转位数 23 int r; 24 cout << "旋转位数:"; 25 cin >> r; 26 27 // 处理旋转位数 28 if (r<0) { 29 cout << "非法的旋转位数" << endl; 30 return 0; 31 } 32 else 33 r %= n; 34 35 // 调用数组旋转函数 36 rotate(array, n, r); 37 38 // 打印旋转结果 39 cout << endl << "旋转后的数组:" << endl; 40 for (int i=0; i<10; i++) { 41 cout << array[i] << " "; 42 } 43 cout << endl; 44 45 return 0; 46 } 47 48 void rotate(int *array, int n, int r) { 49 // 开辟动态数组temp暂存前面r个元素 50 int * temp = new int[r]; 51 52 // 将前r个元素存放至temp 53 for (int i=0; i<r; i++) { 54 temp[i] = array[i]; 55 } 56 // 将后面n-i个元素移动到数组前端 57 for (int i=0; i<n-i; i++) { 58 array[i] = array[i+r]; 59 } 60 // 将暂存的元素填充到数组尾部 61 for (int i=0; i<r; i++) { 62 array[n-r+i] = temp[i]; 63 } 64 65 // 释放内存空间 66 delete []temp; 67 }
运行测试
小结
这种思路实现简单,可是有较大的内存消耗( 见代码50行 )。