---
# System prepended metadata

title: 反转字符串 (题541)
tags: [LeeCode]

---

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