【每日一题20220730】反转字符串 II

:mage:‍给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例 1:

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

示例 2:

输入:s = "abcd", k = 2
输出:"bacd"

提示

  • 1 <= s.length <= 104
  • s 仅由小写英文组成
  • 1 <= k <= 104

任务

编写一个函数, 完成上述操作

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
    # your code here

题目难度:简单
题目来源:541. 反转字符串 II - 力扣(LeetCode)

加油出一份解答 :smiley:

class Solution:
    def reverseStr(self, s: str, k: int) -> str:
    # your code here
        li = list(s)
        for i in range(len(s) // (2 * k) + 1):
            k_i = 2 * k * i
            li[k_i:k_i + k] = reversed(li[k_i:k_i + k])
        return "".join(li)

力扣都有的啊,特别详细 :joy:

class Solution(object):
    def reverseStr(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: str
        """
# 定义左,中,右指针
        left , mid ,right =0,k,2*k
# 定义返回字符串
        res = ""
        while len(res)<len(s):
# 通过切片操作将字符串每隔k字符个反转一次
            res += s[left:mid][::-1]+s[mid:right] 
            left,mid,right = left+2*k,mid+2*k,right+2*k
        return res
class Solution:
    def reverseStr(self, s: str, k: int) -> str:
        def cut(s0: str):
            if len(s0)<=k:
                return s0[::-1]
            elif k<len(s0)<=2*k:
                return s0[k-1::-1]+s0[k:2*k]


        if len(s)%(2*k)==0:
            n=len(s)//(2*k)
        else:
            n=len(s)//(2*k)+1
        x=0
        res_str=''
        while x<n:
            if len(s)>2*k:
                s1=s[:2*k]
                s2=s[2*k:]
                res_str+=cut(s1)
                s=s2
            else:
                res_str+=cut(s)
            x+=1
        return res_str

assert Solution().reverseStr('abcdefg',2)=='bacdfeg'
assert Solution().reverseStr('abcd',2)=='bacd'