题目
设将n(n>1)个整数存放到⼀维数组R中, 试设计一个在时间和空间两方面都尽可能高效的算法;将R中保存的序列循环左移p个位置(0<p<n)个位置, 即将R中的数据由(x0,x1,......,xn-1)变换为 (xp,xp+1,...,xn-1,x0,x1,...,xp-1)。
题目大意:
将数组左移 p个位置拼接至数组末尾。
输入:
[0,1,2,3,4,5,6,7,8,9]
, n = 10,p = 3
输出:
[3,4,5,6,7,8,9,0,1,2]
解析:
- 反转数组
- 反转数组中n-p以前的元素
- 反转数组中n-p以后的元素
复杂度分析
时间复杂度:
空间复杂度:
代码
void reverse(int *pre,int left,int right){
int i = left, j = right;
while(i < j){
temp = pre[i];
pre[i] = pre[j]
pre[j] = temp;
i++;
j--;
}
}
void LeftShift(int *pre,int n,int p){
if (p > 0 && p < n)
{
reverse(pre,0,n);
reverse(pre,0,n-p-1);
reverse(pre,n-p,n-1);
}
}
网友评论