题解 | #左旋转字符串#

左旋转字符串

http://www.nowcoder.com/practice/12d959b108cb42b1ab72cef4d36af5ec

算法思想一:遍历

解题思路:

将字符串 s 分为两个部分,分别对两部分循环遍历,形成左旋转字符串
1、判断特殊情况:字符串 s 为空字符,n > len(s),直接返回空字符
2、创建返回字符 res,循环遍历字符串 s 的【n,len(s)-1】,依次添加到res中
3、第二次循环遍历字符串 s 的【0,n-1】,依次添加到 res 中
4、返回res

代码展示:

Python版本
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        res = ''
        if not s&nbs***bsp;n > len(s):
            return res
        for i in range(n, len(s)):
            res += s[i]
        for j in range(n):
            res += s[j]
        return res

复杂度分析:

时间复杂度O(N):两次循环遍历整个字符串,N表示字符串的长度
空间复杂度O(N):返回数组占用空间,整个字符串长度

算法思想二:substring

解题思路:

主要理由字符串的 substring 函数,根据题意使用 substring 获取指定区间的字符串,最后拼接返回
1、判断特殊情况:字符串 s 为空字符,n > len(s),直接返回空字符
2、str.substring(n) + str.substring(0, n) 拼接返回
字符串 str = 'abcXYZdef'   n=3
步骤 str.substring(n)
str.substring(0, n)
1 XYZdef 'abc'
2 合并:'XYZdefabc'

代码展示:

JAVA版本
public class Solution {
    public String LeftRotateString(String str,int n) {
        if (str == null || n > str.length()) {
            return str;
        }
        return str.substring(n) + str.substring(0, n);
    }
}

复杂度分析:

时间复杂度O(1):使用函数直接获取区间
空间复杂度O(1):没有使用额外空间

算法思想三:字符串字串

解题思路:

由于 s + s 包含了所有可以通过旋转操作从 s 得到的字符串
1、使用额外字符串 tmp = s + s
2、直接获取 tmp字符串的 【n:n+len(s)】
字符串 str = 'abcXYZdef'   n=3
tmp = s + s : 'abcXYZdefabcXYZdef'
tmp[n:n+len(s)] = 'XYZdefabc'

代码展示:

Python版本
class Solution:
    def LeftRotateString(self, s, n):
        # write code here
        tmp = s + s
        return tmp[n:n+len(s)]

复杂度分析:

时间复杂度O(1):使用函数直接获取区间
空间复杂度O(N):使用额外空间tmp,占用 2N 空间





全部评论

相关推荐

我已成为0offer的糕手:别惯着,胆子都是练出来的,这里认怂了,那以后被裁应届被拖工资还敢抗争?
点赞 评论 收藏
分享
shtdbb_:还不错,没有让你做了笔试再挂你
点赞 评论 收藏
分享
评论
2
收藏
分享
牛客网
牛客企业服务