天天看點

劍指Offer:左旋轉字元串(java版)

題目描述

彙編語言中有一種移位指令叫做循環左移(ROL),現在有個簡單的任務,就是用字元串模拟這個指令的運算結果。對于一個給定的字元序列S,請你把其循環左移K位後的序列輸出。例如,字元序列S=”abcXYZdef”,要求輸出循環左移3位後的結果,即“XYZdefabc”。是不是很簡單?OK,搞定它!

将字元串先分割再拼接

public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str==null || str.length()<=1) return str;
        int len = str.length();
        if(n%len == 0){
            return str;
        } else{
            n%=len;
            String s1 = str.substring(0,n);
            String s2 = str.substring(n);
            str = s2.concat(s1);
            return str;
        }
    }
}
           

三次反轉的方法

字元串abcdef,n=3,設X=abc,Y=def,是以字元串可以表示成XY,如題幹,問如何求得YX。

假設X的翻轉為XT,XT=cba,同理YT=fed,那麼YX=(XTYT)T,三次翻轉後可得結果。

public class Solution {
    public String LeftRotateString(String str,int n) {
        if(str==null || str.length()<=1) return str;
        int len = str.length();
        if(n%len == 0){
            return str;
        }
        char[] ch = str.toCharArray();
        reverse(ch,0,n-1);
        reverse(ch,n,len-1);
        reverse(ch,0,len-1);
        return new String(ch);
    }
    public void reverse(char[] ch,int L,int R){
        while(L<R){
            char temp = ch[L];
            ch[L] = ch[R];
            ch[R] = temp;
            L++;
            R--;
        }
    }
}