0541-leetcode算法实现之反转字符串II-reverseStrII-python&golang实现

给定一个字符串 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-string-ii

python

# 反转字符串1
def reverse(s_list, l, r):
    """
    反转列表,左右指针交换元素,相遇停止
    :param s_list:
    :param l:
    :param r:
    :return:
    """
    while l < r:
        temp = s_list[l]
        s_list[l] = s_list[r]
        s_list[r] = temp
        l += 1
        r -= 1

class Solution:
    def reverseStrII(self, s: str, k: int):
        """
        双指针法, 时间O(n), 空间O(n) -> s>list, O(n)空间
        :param s:
        :param k:
        :return:
        """
        s_list = list(s) # 字符串在py中属于不可变类型,转成list操作
        n = len(s_list)
        for l in range(0, n-1, 2*k): # 间隔2k
            r = l + k -1 # 右指针,需要反转的右指针位置
            r = r if r < n-1 else n-1 # 右指针取小值,即当r<n-1时,反转前k个字符,反之全部反转
            reverse(s_list, l, r)
            # reverse(s_list, l, min(r, n-1)) 上述简化
        return ''.join(s_list) # 转回字符串输出

if __name__ == "__main__":
    s = 'legendABC'
    k = 3
    test = Solution()
    print(test.reverseStrII(s, k))

golang

package main

import "fmt"

func main() {
	s := "lengendABC"
	k := 3
	fmt.Println(reverseStrII(s, k))
}

func reverseStrII(s string, k int) string {
	t := []byte(s)
	n := len(t)
	for l := 0; l < n-1; l += 2 * k {
		r := l + k - 1
		reverse(t, l, min(r, n-1))
	}
	return string(t)
}

func reverse(ss []byte, l, r int) {
	for l < r {
		ss[l] ^= ss[r]
		ss[r] ^= ss[l]
		ss[l] ^= ss[r]
		l++
		r--
	}
}

func min(a, b int) int {
	if a < b {
		return a
	}
	return b
}
原文地址:https://www.cnblogs.com/davis12/p/15463470.html