第 2 章 第 3 题 数组旋转问题 平移算法实现1

问题分析

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

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

  约束:无

解答思路

  设数组长度 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行 )。

posted on 2014-03-27 17:18  空山悟  阅读(324)  评论(0编辑  收藏  举报

导航