题目
设将 n (n>1) 个整数放置到一维数组 R 中,试设计一个在时间和空间两方面都尽可能高效的算法.将 R 中保存的序列循环左移 p(0<p<n) 个位置,即将 R 中的数据由 (X0,X1,...Xn-1)变换为(Xp,Xp+1,...Xn-1,X0,X1...Xp-1)
要求:
1)给出算法的基本设计思想
2)根据设计思想,采用C,C++ 或 Java 语言描述算法,关键之处给出注释
3)说明你所设计算法的时间复杂度和空间复杂度
思路
倒置数组,将数组从头到尾逆置一遍,再从 1 到 p 和 p+1 到 n 再分别逆置
时间复杂度: O(n)
空间复杂度: O(1)
核心算法(C++)
#include <cstdio>
#include <cstdlib>
// 倒置数组
void reverse(int* &L, int l, int r){
for (int i = 0; i < (r - l + 1) / 2; i++) {
int temp = *(L + (l - 1) + i);
*(L + (l - 1) + i) = *(L + (r - 1) - i);
*(L + (r - 1) - i) = temp;
}
}
void ans(int* &L, int p, int n) {
reverse(L, 1, n);
reverse(L, 1, p);
reverse(L, p + 1, n);
}
//==============以下为测试==================
const int n = 6;
int main() {
// 生成测试数据
int* R;
R = (int*)malloc(sizeof(int) * n);
for (int i = 0; i < n; i++) {
*(R + i) = i + 1;
}
// 调用逆转
int p = 2;
ans(R, p, n);
for (int i = 0; i < n; i++) {
printf(" %d ", *(R + i));
}
return 0;
}