541 反转字符串2
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
关键在于每次更新增加k,而不是每次加1,其次是在i+k,在实际的reverse函数中,right需要减1,因为索引下标从0开始。
class Solution:
def reverseStr(self, s: str, k: int) -> str:
# s_list = list(s)
# def reverse(i, j, s_list):
# k = i
# e = j
# while (k < i + (j-i)/2):
# s_list[k], s_list[e] = s_list[e], s_list[k]
# k += 1
# e -= 1
# return s_list
# n = len(s_list)
# count = n // (2*k)
# for x in range(count):
# p = 2*k*x
# q = 2*k*(x+1)-1 - k
# s_list = reverse(p, q, s_list)
# count_end = n % (2*k)
# if count_end >= k:
# p = 2*k*count
# q = p + k - 1
# s_list = reverse(p, q, s_list)
# if count_end < k:
# p = 2*k*count
# q = n - 1
# s_list = reverse(p, q, s_list)
# return ''.join(s_list)
s_list = list(s)
def reverse(s_list, x, y):
left = x
right = y - 1
while (left < x + (y-x)/2):
s_list[left], s_list[right] = s_list[right], s_list[left]
left += 1
right -= 1
return s_list
i = 0
while i < len(s_list):
if i+k <= len(s_list):
s_list = reverse(s_list, i, i+k)
if i+k > len(s_list):
s_list = reverse(s_list, i, len(s_list))
i += 2*k
return ''.join(s_list)