数组循环移位 设计一个算法,把一个含有N个元素的数组循环移位K位,要求时间复杂度为O(N),且只允许使用两个附加变量 No.1 K abcd1234→ 4abcd123→.... 代码如下: /* * 数组移位第一种方法,一位一位的移动 * arr要移动的数组 K移动的位数 * 时间复杂度O(N^2) */ public static String rotateFirst(String rotateSting,int K) { char[] arr=rotateSting.toCharArray();; int N= arr.length; K %= N; //如果K>N,则K-N之后的数组序列跟移动K位是一样的 while(K!=0) { arr[0]=arr[N-1]; //先给arr[0]赋值 for(int i=N-1;i>0;i--) //倒者赋值 { arr[i]=arr[i-1]; } K--; } return new String(arr); } No.2 逆序 /* * 数组移位第二种方法 * 1.逆序排列abcd: abcd1234 → dcba1234 * 2.逆序排列1234: dcba1234 → dcba4321 * 3.全部逆序 dcba4321 → 1234abcd * 时间复杂度 O(N)线性时间 */ public static String rotateSecond(String rotateSting,int K) { char[] arr=rotateSting.toCharArray();; int N= arr.length; K %= N; //如果K>N,则K-N之后的数组序列跟移动K位是一样的 arr=Reverse(arr,0,K-1); arr=Reverse(arr,K,N-1); arr=Reverse(arr,0,N-1); return new String(arr); } /* * 逆序 * arr逆序数组 be逆序开始位置 en结束位置 */ public static char[] Reverse(char[] arr,int be,int en) { for(;be<en;be++,en--) { char temp=arr[en]; arr[en]=arr[be]; arr[be]=temp; } return arr; }