问题描述:给定一个字符串S[0...N-1],要求把S的前k个字符移动到S的尾部,如把字符串"abcdef"前面的2个字符“a”和“b”移动到字符串的尾部,得到新的字符串"cdefab";即字符串循环左移k。
算法分析:把abcdef看成是由X=ab和Y=cdef组成,由矩阵转稚公式(X`y`)`=YX,
如X = ab X`=ba Y=cdef Y`=fedc 所以只需要把X和Y都转稚后,再整体转稚就可以实现循环左移
代码:
public static void main(String[] args) { char[] array = new char[5]; array[0] = 'a'; array[1] = 'b'; array[2] = 'c'; array[3] = 'd'; array[4] = 'e'; loopRight(array, 2); for(char s : array){ System.out.println(s); } } /** * 把字符串的前k个移动到数组的尾部 * @param array * @param k * @return */ public static void loopRight(char[] array, int k){ char[] temp1 = Arrays.copyOfRange(array,0, k); reverseStr(temp1); char[] temp2 = Arrays.copyOfRange(array, k,array.length); reverseStr(temp2); for(int i = 0;i < k;i++){ array[i] = temp1[i]; } for(int i = k;i<array.length;i++){ array[i] = temp2[i-k]; } reverseStr(array); } /** * 翻转字符串 * @param array * @return */ public static void reverseStr(char[] array){ int from = 0; int to = array.length-1; char temp; while(from < to){ temp = array[from]; array[from++] = array[to]; array[to--] = temp; } }