面试题58_II_左旋转字符串

题目描述

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"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;
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 左旋转字符串 题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左...
    阿星啊阿星阅读 1,534评论 0 0
  • 本文首发于我的个人博客:尾尾部落 1. KMP 算法 谈到字符串问题,不得不提的就是 KMP 算法,它是用来解决字...
    繁著阅读 10,014评论 0 28
  • 题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。...
    囧略囧阅读 861评论 0 0
  • 1. 找出数组中重复的数字 题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,...
    BookThief阅读 5,863评论 0 2
  • 题目描述汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对...
    ProudLin阅读 1,007评论 0 0