剑指 Offer 58 - II. 左旋转字符串

632 阅读2分钟

剑指 Offer 58 - II. 左旋转字符串

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1、题目

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

实例1

输入: s = "abcdefg", k = 2

输出: "cdefgab"

实例2

输入: s = "abcdefg", k = 2

输出: "cdefgab"

提示

  • 1 <= k < s.length <= 10000

2、思路

方法一

  1. 截取所需要转移到字符串的尾部的字符串部分通过字符保存下来
  2. 利用replace来替换原数组中截取的部分用""来进行替换
  3. 替换完成后,利用StringBuffer进行拼接。

方法二

  1. 用字符串【a, b, c, d, e, f, g】举例说明,首先我们将s字符串先进行反转得到【g, f, e, d, c, b, a】
  2. 把将要转移到字符串的尾部的字符串部分叫做 s1,不用处理的部分叫做 s2,所以有: s = s1 + s2。假设 s = "gfedvba", k = 2。那么 s1 = "ba",s2 = "gfedc"。
  3. 翻转 s2,则有:s2 = "gfedc",s = "abgfedc"。
  4. 再翻转 s1,则有:s1 = "ab",s = "cdefgab"。
  5. 返回 s 即可。所以三次翻转,本题就能完成。

废话少说 ~~~~~ 上代码!

3、代码

第一次commit AC

class Solution {
    public String reverseLeftWords(String s, int n) {
        String s1 = s.substring(0, n);
        String replace = s.replace(s1, "");
        StringBuffer sb = new StringBuffer(replace);
        sb.append(s1);
        return sb.toString();
    }
}

第二次commit AC

class Solution {
    public String reverseLeftWords(String s, int n) {
        char c[] = s.toCharArray();
        int l = c.length;
        reverse(c, 0, l - 1);
        reverse(c, 0, l - n -1);
        reverse(c, l - n, l - 1);
        return new String(c);
    }
    public static void reverse(char c[], int left, int right){
        while(left < right){
            char temp = c[left];
            c[left] = c[right];
            c[right] = temp;
            left++;
            right--;
        }
    }
}

4、总结

该题目的使用 substr反转 时间复杂度是一样的 ,都是O(n),但是使用 substring 申请了额外空间,所以空间复杂度是O(n),而反转方法的空间复杂度是O(1)。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接: 剑指 Offer 58 - II. 左旋转字符串