题目描述
给定一个字符串 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
解法一:双指针
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
|
func reverseStr(s string, k int) string {
b := []byte(s)
reverse := func(i, j int) {
for i < j {
b[i], b[j] = b[j], b[i]
i++
j--
}
}
i, j := 0, 0
for j < len(b) {
if j-i+1 == 2*k {
reverse(i, i+k-1)
i = j + 1
}
j++
}
if j-i < k {
// 翻转剩余字符
reverse(i, len(b)-1)
} else {
// 翻转前 k 个字符
reverse(i, i+k-1)
}
return string(b)
}
|
官方题解如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
func reverseStr(s string, k int) string {
t := []byte(s)
for i := 0; i < len(s); i += 2 * k {
sub := t[i:min(i+k, len(s))]
for j, n := 0, len(sub); j < n/2; j++ {
sub[j], sub[n-1-j] = sub[n-1-j], sub[j]
}
}
return string(t)
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
|