题目
设将n()个整数存放到⼀维数组R中, 试设计一个在时间和空间两方面都尽可能高效的算法;将R中保存的序列循环左移 p 个位置()个位置, 即将R中的数据由变换为 。
题目大意
将数组左移 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);
}
}