题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数字2,该函数将返回左旋转2位得到的结果"cdefgab"。


  首先最直观的,我们肯定会想到使用库函数的拼接方法,来解决本题,但是,平心而论,如果在面试或者笔试中出现这题,考点肯定不是考你会不会使用库函数,屏蔽了大量的库函数体现不出差距,基础扎实才有更多机会,所以库函数需要会使用,而不用库函数的方法也应该掌握。

解法1:

  在不使用库函数的时候,如果做过58.1题,也就牛客上的,翻转单词顺序这道题,就可以理解到,本题虽然是旋转字符串,实则也是翻转的一种处理方式。比如"Hello world"翻转这个语句的单词,就变成了"world Hello",看起来是不是就是将hello旋转移动了呢。
  设计如何翻转,比如123456变成345612,给的翻转位数是2。需要先变成213456即前两位翻转,再变成216543即后四位翻转,最后变成345612即整体来个翻转.(这三个翻转的顺序可以打乱,也可以先整体翻转,在翻转前4位,再最后2位翻转)

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str == null || str.length() == 0 || n <= 0) 
            return str;
        if (n >= str.length())//例外就是可能n会大于字符串的长度,因此还需要处理
            n = n % str.length();
        char[] ch = str.toCharArray();//转换成char数组,方便操作
        reverseString(ch, 0, n - 1);//从头到尾都翻转
        reverseString(ch, n, str.length() - 1);//
        reverseString(ch, 0, str.length() - 1);
        return String.valueOf(ch);
    }

    public void reverseString(char[] ch, int start, int end) {
        while (start < end) {
            char temp = ch[start];
            ch[start] = ch[end];
            ch[end] = temp;
            start++;
            end--;
        }
    }
}

解法2:

老规矩,简便偷懒的写法肯定也得会,要所有细节都自己实现,还要库函数干嘛。

public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str == null || n > str.length()) {
            return str;
        }
        n = n%str.length();
        return str.substring(n) + str.substring(0, n);
    }
}