字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”

时间:2021-11-06 01:32:02

方法1

    private static String LeftRotateString1(String str,int n) {
if(str.length() == 0||str == null || n < 0) return str;
n = n % str.length();
return str.substring(n) + str.substring(0, n);
}

这个方法直接将向左循环出去的子字符串直接连接到剩下的字符串后,因为是循环,所以要对左移次数对字符串长度取模;
注意:String.substring(0,n);这个方法是相当于【0,n),右边是开的,子字符串中不会包含第n个字符;

方法2

        public String LeftRotateString2(String str,int n)
{
char []c=str.toCharArray();
if(c.length<n)return "";
//先逆序被移位出去的那些字符 例如[a,b,c,d,e] n = 3 ---> [c,b,a,d,e]
reverse(c,0,n-1);
//再逆序剩下的那些字符 -----> [c,b,a,e,d]
reverse(c,n,c.length-1);
//再将整个字符数组逆序一遍 ---->[d,e,a,b,f]
reverse(c,0,c.length-1);
StringBuilder sb=new StringBuilder();
for(char t:c)sb.append(t);
return sb.toString();
}
public void reverse(char []c,int low,int high)
{
while(low<high)
{
char temp=c[low];
c[low]=c[high];
c[high]=temp;
low++;
high--;
}
}

这个方法的时间复杂度是O(n),空间复杂度是O(n);