习题2.2 数组循环左移 (20point(s))
本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向左移m(≥0)个位置,即将a中的数据由(a0a1⋯an−1)变换为(am⋯an−1a0a1⋯am−1)(最前面的m个数循环移至最后面的m个位置)。如果还需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
Example1:
#include <iostream>
using namespace std;
void reverse(int *p, int b, int e)
{
while(b < --e) {
int temp = p[b];
p[b++] = p[e];
p[e] = temp;
}
}
int main()
{
int n, m;
cin >> n >> m;
m = m % n;
int *p = new int[n];
for(int i = 0; i < n; i++) cin >> p[i];
reverse(p, 0, m);
reverse(p, m, n);
reverse(p, 0, n);
for(int i = 0; i < n-1; i++) cout << p[i] << ' ';
cout << p[n-1] << endl;
}
Example2:
#include <iostream>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
m = m % n;
int *p = new int[n];
for(int i = n-m; i < n; i++) cin >> p[i];
for(int i = 0; i < n-m; i++) cin >> p[i];
for(int i = 0; i < n -1; i++) cout << p[i] << ' ';
cout << p[n-1] << endl;
}
思路:
翻转数组3次。