题目:编写一个函数,作用是把一个字符串循环左移/右移n位。比如:给定原字符串"abcdefgh",如果n=2,左移2位后应该是"cdefghab",右移两位后应该是"ghabcdef"。

(以右移为例)
方法一:按位移动

移动1位:habcdefg
移动2位:ghabcdef
移动3位:fghabcde
移动4位:efghabcd
移动5位:defghabc

空间复杂度O(1); 时间复杂度O(n*n)

方法二:按移动位置切片
“abcdefgh”切成“abc”和”defgh”,然后将“abc”append到“defgh”后面,得到“defghabc”

空间复杂度O(n);时间复杂度O(n)

方法三:三次反转
  主要思想:根据移位将字符串切割成两个字串,两个子串分别反转后,再把合并成的字符串反转,得到最终结果。(注意这里程序实际不分割子串,只是根据逻辑上的字串分别做反转)

向右移动两位:
找到切割位置s.length()-n后,
将“abcde”反转成“edcba”
将“fgh”反转成“hgf”
当前字符串变为“edcbahgf”,再将此字符串整体反转变为“fghabcde”得到结果。

向左移动两位
找到切割位置n-1后,
将“ab”反转成“ba”
将“cdefgh”反转成“hgfedc”
当前字符串变为“bahgfedc”,再将此字符串整体反转变为“cdefghab”得到结果。

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

public class Test11 {
    public static void main(String[] args) {
        String s = "abcdefgh";
        //int n =s.length()-2; //向右移2位
        int n = 2; //向左移2位
        char[] c = s.toCharArray();
        System.out.println(reverse(c,0,n-1));
        System.out.println(reverse(c,n,c.length-1));
        System.out.println(reverse(c,0,c.length-1));

    }

    public static char[] reverse(char[] c,int begin,int end){
        char temp;
        while(end>begin){
            temp = c[begin];
            c[begin] = c[end];
            c[end] = temp;
            end--;
            begin++;
        }
        return c;
    }
}