面试题58_II_左旋转字符串

2020-02-19  本文已影响0人  shenghaishxt

题目描述

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

题解一

直接用Java String的API操作,那真是再简单不过了。。。

class Solution {
    public String reverseLeftWords(String s, int n) {
        return s.substring(n, s.length()) + s.substring(0, n);
    }
}

题解二

但由于本题的核心是考察对于字符串翻转的灵活运用,所以上面使用API的解法就失去了其意义。受到上题翻转单词顺序的启发,我们可以将字符串分为两部分,前n个字母为一部分,剩下的字母为一部分。先单独翻转这两部分,然后再对整体字符串一起翻转。例如对于"abcdefg",n为2。分别翻转"ab"和"cdefg",得到bagfedc,然后再对整个字符串进行翻转即可得到"cdefgab"。

这个思路可用线性代数的矩阵表示为
YX = (X^T Y^T)^T

下面是参考代码:

class Solution {
    public String reverseLeftWords(String s, int n) {
        if (s.length() < n)
            return "";
        char[] chars = s.toCharArray();
        reverse(chars, 0, n-1);
        reverse(chars, n, chars.length-1);
        reverse(chars, 0, chars.length-1);

        // 字符数组转化为字符串
        return String.valueOf(chars);
    }

    private void reverse(char[] chars, int left, int right) {
        if (left > right)
            return;
        while (left < right) {
            char temp = chars[left];
            chars[left++] = chars[right];
            chars[right--] = temp;
        }
    }
}
上一篇下一篇

猜你喜欢

热点阅读