58-左旋转字符串

1.翻转单词序列

例如输入字符串"I am a student. ",则输出"student. a am I"。

class Solution {
    public String reverseWords(String str) {
        if (str == null) return null;
        if (str.length() <= 1) return str;
        char[] c = str.toCharArray();
        int i = 0, j = c.length - 1;
        reverse(c, i, j);
        while (i < j && c[i] == ' ') i++;
        while (j > i && c[j] == ' ') j--;
        int m = i;
        while(i < j) {
            while (m < j && c[m + 1] != ' ') m++;
            reverse(c, i, m);
            i = m + 2;
            m = i;
        }
        return new String(c);
    }

    private void reverse(char[] c, int i, int j) {
        while (i < j) {
            char tmp = c[i];
            c[i] = c[j];
            c[j] = tmp;
            i++;
            j--;
        }
    }
}

2.字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。

请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

两种思路:1.先将整个字符数组翻转一下,再将[0, n - k)和[n - k, n)翻转一下。

class Solution {
    public String reverseLeftWords(String s, int n) {
        char[] array = s.toCharArray();
        reverse(array, 0, array.length - 1);
        reverse(array, array.length - n, array.length - 1);
        reverse(array, 0, array.length - n - 1);
        return new String(array);
    }

    private void reverse(char[] array, int start, int end)  {
        int sum = start + end;
        for (int i = start; i <= start + (end - start - 1) / 2; i++) {
            char tmp = array[i];
            array[i] = array[sum - i];
            array[sum - i] = tmp;
        }
    }
}
  1. 用 substring
public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str == null) return null;
        if (str.length() <= n) return str;
        String left = str.substring(0, n);
        String right = str.substring(n);
        return right + left;
    }
}

你可能感兴趣的:(58-左旋转字符串)