【剑指 Offer_58 – II】左旋转字符串_Python&Java_列表字符串切片拼接解法

部分参考面试题58 - II. 左旋转字符串(切片 / 列表 / 字符串,清晰图解),如有侵权,请联系删除。

题目描述

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

示例 1:

输入: s = “abcdefg”, k = 2
输出: “cdefgab”

示例 2:

输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”

限制:

1 <= k < s.length <= 10000

方法一、Python列表遍历添加删除

思路:添加前n个数字到列表末尾,然后再删除前n个数字。该方法不是很好的解法,但是比较容易理解。

Python解法

class Solution(object):
    def reverseLeftWords(self, s, n):
        s = list(s)
        s.extend(s[:n])
        for m in s[:n]:
            s.remove(m)
        return "".join(s)

耗时108ms

复杂度分析

时间复杂度:O(m+n),遍历n复杂度为0(n)和连接列表复杂度为O(m),m为字符串的长度,n为左旋转的数字数目
空间复杂度:O(n),开辟了一个列表

方法二、Python列表遍历添加

Python解法

class Solution(object):
    def reverseLeftWords(self, s, n):
        res = []
        for i in range(n, len(s)):
            res.append(s[i])
        for i in range(n):
            res.append(s[i])
        return ''.join(res)

耗时44ms

Java解法

class Solution {
    public String reverseLeftWords(String s, int n) {
        StringBuilder res = new StringBuilder();
        for(int i = n; i < s.length(); i++)
            res.append(s.charAt(i));
        for(int i = 0; i < n; i++)
            res.append(s.charAt(i));
        return res.toString();
    }
}

耗时4ms

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)

方法三、字符串遍历添加

与上面的方法二类似

Python解法

class Solution(object):
    def reverseLeftWords(self, s, n):
        res = ""
        for i in range(n, len(s)):
            res += s[i]
        for i in range(n):
            res += s[i]
        return res

耗时88ms

Java解法

class Solution {
    public String reverseLeftWords(String s, int n) {
        String res = "";
        for(int i = n; i < s.length(); i++)
            res += s.charAt(i);
        for(int i = 0; i < n; i++)
            res += s.charAt(i);
        return res;
    }
}

耗时75ms

复杂度分析

时间复杂度:O(n)
空间复杂度:O(n)

方法四、字符串切片

思路:直接利用切片和“+”的方法进行字符串的拼接

Python解法

class Solution(object):
    def reverseLeftWords(self, s,n):
        return s[n:] + s[:n]

耗时32ms

Java解法

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

耗时24ms

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

总结

在 Python 和 Java 中,字符串是 “不可变对象”,使用字符串拼接时每次都需要新建一个字符。python的列表和java的Stringbuilder列表使用append效率较高。所以推荐使用append的方法。具体参考面试题58 - II. 左旋转字符串(切片 / 列表 / 字符串,清晰图解)的效率分析。

博主比较小白,但是热爱分享。一直感觉自己写代码的能力,算法能力都不太行,所以最近开始刷LeetCode,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~

匿名

发表评论

匿名网友