Skip to content

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),我们需要一个额外的字节切片来存储修改后的字符串。

三、总结

直接法简单且高效,符合题目要求。在这个特定的问题上,这种方法是最佳选择,因为它直接解决了问题,没有不必要的复杂性。

木川工作室 (微信:mcmc2024)