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

Posted 炫云云

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指 Offer 58 - II. 左旋转字符串相关的知识,希望对你有一定的参考价值。

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

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

示例 1:

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

示例 2:

输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

字符串切片

应用字符串切片函数,可方便实现左旋转字符串。

获取字符串 s [ n : ] s[n:] s[n:] 切片和 s [ : n ] s[:n] s[:n] 切片,使用 “+” 运算符拼接并返回即可。

class Solution(object):
    def reverseLeftWords(self, s, n):
        """
        :type s: str
        :type n: int
        :rtype: str
        """
        return s[n:] + s[:n]

列表遍历拼接

算法流程:

  1. 新建一个 list(Python)、StringBuilder(Java) ,记为 resres
  2. 先向 r e s res res 添加 “第 n + 1 n + 1 n+1​ 位至末位的字符” ;
  3. 再向 r e s res res 添加 “首位至第 n n n​ 位的字符” ;
  4. 将 res 转化为字符串并返回。
class Solution(object):
    def reverseLeftWords(self, s, n):
        """
        :type s: str
        :type n: int
        :rtype: str
        """
        res = []
        for i in range(n , len(s)):
            res.append(s[i])
        for i in range(n):
            res.append(s[i])
        return ''.join(res)

利用求余运算,可以简化代码。

class Solution(object):
    def reverseLeftWords(self, s, n):
        """
        :type s: str
        :type n: int
        :rtype: str
        """
        res = []
        for i in range(n, n + len(s)):
            res.append(s[i % len(s)])
        return ''.join(res)

s= Solution()
s.reverseLeftWords(s = "abcdefg", n = 2)
'cdefgab'

字符串遍历拼接

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

原地反转

具体步骤为:

  1. 反转区间为前n的子串
  2. 反转区间为n到末尾的子串
  3. 反转整个字符串

最后就可以得到左旋n的目的,而不用定义新的字符串,完全在本串上操作。

class Solution(object):
    def reverseLeftWords(self, s, n):
        """
        :type s: str
        :type n: int
        :rtype: str
        """
        s = list(s)
        s[0:n] = list(reversed(s[0:n]))
        s[n:] = list(reversed(s[n:]))
        s.reverse()
        return "".join(s)

参考

Krahets - 力扣(LeetCode) (leetcode-cn.com)

以上是关于剑指 Offer 58 - II. 左旋转字符串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode剑指 Offer 58 - II. 左旋转字符串(C++)

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

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

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

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

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