# 反转字符串 (题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`