# 反转字符串 (题541) --- ```javascript= 给定一个字符串s和一个整数k,你需要对从字符串开头算起的每隔2k个字符的前k个字符进行反转。 如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 示例: 输入: s = "abcdefg", k = 2 输出: "bacdfeg" 提示: 该字符串只包含小写英文字母。 给定字符串的长度和 k 在 [1, 10000] 范围内。 ``` :::success ```go= func reverseString(s []byte, left, right int) { for ; left < right; left, right = left+1, right-1 { s[left], s[right] = s[right], s[left] } } func reverseStr(s string, k int) string { sByte := []byte(s) length := len(s) // 每2k个一组,前k个反转,后k个原封不动 for i := 0; i < length; i += 2 * k { end := i + k - 1 if end > length - 1 { end = length - 1 } reverseString(sByte, i, end) } return string(sByte) } ``` ::: :::success ```go= func reverseString(s []byte, left, right int) { for ; left < right; left, right = left+1, right-1 { s[left], s[right] = s[right], s[left] } } func reverseStr(s string, k int) string { sByte := []byte(s) length := len(s) flag := 1 // 每k个一组,前k个反转,后k个原封不动, 这时候就需要一个标志位 // flag = 1,表示需要反转的前k个,flag = -1表示无需反转的后k个 for i := 0; i < length; i += k { if flag == 1 { end := i + k - 1 if end > length - 1 { end = length - 1 } reverseString(sByte, i, end) } flag *= -1 } return string(sByte) } ``` ::: :::success ```go= // 双指针解法 func reverseStr(s string, k int) string { var ( i, left, right, length int ) str := []byte(s) length = len(str) for ; i < length; i += 2 * k { left = i // 首指针 right = i + k - 1 // 尾指针 if right > length - 1 { // 不够k个长度, 尾指针指向字符串尾部 right = length - 1 } reverseString(str, left, right) } return string(str) } func reverseString(s []byte, left, right int) { for ; left < right; left, right = left + 1, right - 1 { // 首尾指针同时移动,首指针不能超过字符的总长度 s[left], s[right] = s[right], s[left] } } ``` ::: ###### tags: `LeeCode`