设将n(n>1)个整数存放到一维数组R中, 试设计一个在时间和空间两方面都尽可能高效的算法;将R中保存的序列循环左移p个位置(0<p<n)个位置, 即将R中的数据由(x0,x1,......,xn-1)变换为(xp,xp+1,...,xn-1,x0,x1,...,xp-1)。
示例:
输入:pre[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
n = 10, p = 3
输出:pre[10] = {3, 4, 5, 6, 7, 8, 9, 0, 1, 2}
解题思路:
先逆置整个数组,再逆置前n-p个元素和后面的p个元素
代码:
typedef struct Node{
int data;
struct Node *next;
} Node;
typedef struct Node * LinkList;
void Reverse(int *pre, int left, int right) {
int i = left;
int j = right;
int temp;
while (i < j) {
temp = pre[i];
pre[i] = pre[j];
pre[j] = temp;
i++;
j--;
}
}
void RotateLeft(int *pre, int n, int p) {
if (p > 0 && p < n) {
Reverse(pre, 0, n - 1);
Reverse(pre, 0, n -1 - p);
Reverse(pre, n - p, n - 1);
}
}
网友评论