541. 反转字符串II

给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

func reverseString(str string, k int) string {
count := len(str) / (2 * k)
if count >= 1 {
length := count * (2 * k)
index := 0
// 有多个2k
for temp := count; temp > 0; temp-- {
runes := reverse(str, index, index+k-1)
str = string(runes)
index += (2 * k)
}
if len(str)-length >= k {
return string(reverse(str, length, length+k-1))
}
return str
} else if len(str) >= k {
// k到2k数量(包括k)
return string(reverse(str, 0, k-1))
} else {
// 小于k的数量
return string(reverse(str, 0, len(str)-1))
}
}

func reverse(strr string, begin int, end int) []rune {
str := []rune(strr)
for begin < end {
str[begin], str[end] = str[end], str[begin]
begin++
end--
}
return str
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
func reverseString(s string, k int) string {
sArr := []byte(s)
length := len(s)
for i := 0; i < length; i += 2 * k {
if i+k < length {
reverse(sArr[i : i+k])
} else {
reverse(sArr[i:length])
}
}
return string(sArr)
}

func reverse(arr []byte) {
left := 0
right := len(arr) - 1
for left < right {
arr[left], arr[right] = arr[right], arr[left]
left++
right--
}
}