题目:编写一个函数,作用是把一个字符串循环左移/右移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;
}
}