美文网首页
面试题58_II_左旋转字符串

面试题58_II_左旋转字符串

作者: shenghaishxt | 来源:发表于2020-02-19 15:23 被阅读0次

    题目描述

    字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"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;
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:面试题58_II_左旋转字符串

          本文链接:https://www.haomeiwen.com/subject/wndafhtx.html