541.反转字符串 II
一、问题描述
给定一个字符串 s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
如果剩余字符少于 k
个,则将剩余字符全部反转。
如果剩余字符小于 2k
但大于或等于 k
个,则反转前 k
个字符,其余字符保持原样。
示例:
plaintext
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
二、方案:直接法
1、思路
我们可以直接按照题目要求进行操作。遍历字符串,每次跳过 2k
个字符,然后反转前 k
个字符。如果剩余字符少于 k
个,则反转所有剩余字符。
2、代码实现
go
func reverseStr(s string, k int) string {
bytes := []byte(s)
for i := 0; i < len(s); i += 2 * k {
left := i
right := i + k - 1
if right >= len(s) {
right = len(s) - 1
}
for left < right {
bytes[left], bytes[right] = bytes[right], bytes[left]
left++
right--
}
}
return string(bytes)
}
3、复杂度分析
- 时间复杂度:O(n),其中 n 是字符串的长度。每个字符只被访问一次。
- 空间复杂度:O(n),我们需要一个额外的字节切片来存储修改后的字符串。
三、总结
直接法简单且高效,符合题目要求。在这个特定的问题上,这种方法是最佳选择,因为它直接解决了问题,没有不必要的复杂性。