给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
- 如果剩余字符少于
k
个,则将剩余字符全部反转。 - 如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
输入:s = "abcd", k = 2
输出:"bacd"
1 <= s.length <= 104
s
仅由小写英文组成1 <= k <= 104
该题是344-反转字符串升级版,只需要在其基础上按逻辑判断,然后每个部分数组进行反转即可。
func reverseStr(s string, k int) string {
b := []byte(s)
end := len(b)
for start := 0; start < end; start += 2 * k {
sub := end - start
//如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样
if sub >= k {
reverse_part(b, start, start+k-1)
} else {
//如果剩余字符少于 k 个,则将剩余字符全部反转。
reverse_part(b, start, start+sub-1)
}
}
return string(b)
}
// 反转指定部分的数组元素
func reverse_part(b []byte, start, end int) {
for start < end {
b[start], b[end] = b[end], b[start]
start++
end--
}
}