【剑指 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,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂java杰尼龟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值