541. 反转字符串 II 简单
给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
提示:
- 该字符串只包含小写英文字母。
- 给定字符串的长度和 k 在 [1, 10000] 范围内。
代码参考:
package main
import "fmt"
func main() {
fmt.Println(reverseStr("abcdefg", 2)) // bacdfeg
}
// 逻辑...
// 画区间图就简洁明了
func reverseStr(s string, k int) string {
runes := []rune(s)
n := len(runes)
reverse := func(rs []rune) []rune {
s, e := 0, len(rs)-1
for s <= e {
rs[s], rs[e] = rs[e], rs[s]
s++
e--
}
return rs
}
res := make([]rune, 0, len(runes))
switch {
case n < k:
res = append(res, reverse(runes[:])...)
case n < 2*k:
res = append(res, reverse(runes[:k])...)
default:
segs := n / (2 * k)
start := 0
for i := 0; i < segs; i ++ {
start = 2 * i * k
res = append(res, reverse(runes[start:start+k])...) // 不断反转 [even*k, even*k+k-1] 偶数起始区间的字符
}
start += 2 * k
remain := n - start
switch {
case remain < k:
res = append(res, reverse(runes[start:])...)
case remain < 2*k:
res = append(res, reverse(runes[start:start+k])...)
}
}
return string(runes)
}
最后编辑: kuteng 文档更新时间: 2021-06-05 10:16 作者:kuteng