跳至主要內容

左旋转字符串

soulballad算法剑指Offer剑指Offer约 429 字大约 1 分钟

题目:

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

分析:

​ 这个问题和上一个是非常相似的,我们同样可以通过翻转字符串的办法来解决第二个问题。

以 "abcdefg" 为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符都分到第二部分。我们先分别翻转这两部分,于是就得到"bagfedc"。接下来我们再翻转整个字符串,得到的"cdefgab"刚好就是把原始字符串左旋转2位的结果。

通过分析可以发现,我们只需要调用三次Reverse方法就可以实现字符串的左旋转功能

代码:

class LeftReverseSolution {

    private static void reverse(char[] arr, int start, int end) {
        if (null == arr || start < 0 || end > arr.length - 1) {
            return;
        }

        while (start < end) {
            char temp = arr[start];
            arr[start] = arr[end];
            arr[end] = temp;

            start++;
            end--;
        }
    }

    public static String leftReverse(String data, int num) {
        if (null == data || "".equals(data)) {
            return null;
        }

        int length = data.length();
        char[] chs = data.toCharArray();

        if (num > 0 && length > num) {
            // 翻转字符串的前面n个字符
            reverse(chs, 0, num - 1);
            // 翻转字符串的后面部分
            reverse(chs, num, length - 1);
            // 翻转整个字符串
            reverse(chs, 0, length - 1);
        }

        return String.valueOf(chs);
    }

    public static void main(String[] args) {
        String data = "abcdefg";
        System.out.println(leftReverse(data, 2));
    }
}
上次编辑于:
贡献者: soulballad