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