题目来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems 特别鸣谢:来自夸夸群的 醉笑陪公看落花@知乎,王不懂不懂@知乎,QFIUNE@csdn 感谢醉笑陪公看落花@知乎 倾囊相授,感谢小伙伴们督促学习,一起进步
给定一个字符串 s 和一个整数 k,从字符串开头算起,每 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
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/reverse-string-ii
手动反转 - 通过
特别容易错,尤其是-1部分,以及剩余部分进行的反转
class Solution:
def reverseStr(self, s: str, k: int) -> str:
p = 0
ss = list(s)
n = len(s)
while p+k<=len(s):
for i in range(k//2):
ss[i+p],ss[k-i+p-1] = ss[k-i+p-1], ss[i+p]
p+=2*k
for i in range(p,p+(n-p)//2):
ss[i],ss[n-i+p-1] = ss[n-i+p-1], ss[i]
return ''.join(ss)
用库函数,间隔2k进行反转 - 通过
库函数屏蔽了越界情况的反转 这道学会了reversed的使用细则
class Solution:
def reverseStr(self, s: str, k: int) -> str:
s = list(s)
for i in range(0,len(s),2*k):
s[i:i+k] = reversed(s[i:i+k])
return ''.join(s)
两种方法效率差不多,第二种方法不容易错
|