一、第一种方法,都想得到的。

Java代码
  1. static int[] LeftShift1(int[] arr,int K){//K为循环左移位数
  2. int N=arr.length;
  3. int[] new_arr=new int[N]; //新开一个数组,空间复杂度O(n)
  4. for(int i = 0; i
  5. new_arr[i] = arr[(K+i)%N ];
  6. return new_arr;
  7. }

static int[] LeftShift1(int[] arr,int K){//K为循环左移位数  
   int N=arr.length;
   int[] new_arr=new int[N]; //新开一个数组,空间复杂度O(n)
   for(int i = 0; i 




二、利用“翻转”完成优化,《编程之美》上的算法

考虑一下数组A中元素1234567循环左移2位到底是怎么个情况!!!将数组A分成两个部分:A[0~k-1] 和 A[k~n-1] ,(12与34567)将这两个部分分别翻转,然后放在一起在翻转(逆序)。具体是这样的:

(1)翻转12:12 ---> 21

(2)翻转34567: 34567 ---> 76543

(3)一起翻转2176543:2176543 --->3456712

Java代码
  1. //翻转b~e
  2. static void Reverse(int[] arr, int b, int e){
  3. while(b < e){
  4. int temp = arr[e]; //只需新开一个辅助空间
  5. arr[e] = arr[b];
  6. arr[b] = temp;
  7. b++;
  8. e--;
  9. }
  10. }
  11.  
  12. //左移K位
  13. static void LeftShift(int[] arr, int K){
  14. int N=arr.length;
  15.  
  16. //如果K>N,取K=K%N。
  17.  
  18. K %= N;
  19. Reverse(arr, 0, K - 1);
  20. Reverse(arr, K, N - 1);
  21. Reverse(arr, 0, N - 1);
  22. }

//翻转b~e
static void Reverse(int[] arr, int b, int e){  
     while(b < e){  
       int temp = arr[e];  //只需新开一个辅助空间
        arr[e] = arr[b];  
        arr[b] = temp;  
        b++;
        e--;
    }  
   }  

   //左移K位
   static void  LeftShift(int[] arr, int K){  
    int N=arr.length;

    //如果K>N,取K=K%N。
     
    K %= N;  
    Reverse(arr, 0, K - 1);  
    Reverse(arr, K, N - 1);  
    Reverse(arr, 0, N - 1);  
   }