【算法题】5.左移数组

154 阅读1分钟

题目

设将n(n>1n>1)个整数存放到⼀维数组R中, 试设计一个在时间和空间两方面都尽可能高效的算法;将R中保存的序列循环左移 p 个位置(0<p<n0<p<n)个位置, 即将R中的数据由(x0,x1,......,xn1)(x_0,x_1,......,x_{n-1})变换为 (xp,xp+1,...,xn1,x0,x1,...,xp1)(x_p,x_{p+1},...,x_{n-1},x_0,x_1,...,x_{p-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]

解析

  1. 反转数组
  2. 反转数组中n-p以前的元素
  3. 反转数组中n-p以后的元素

复杂度分析

时间复杂度:O(n)O(n) 空间复杂度:O(1)O(1)

代码

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);
   }
}