541. 反转字符串 II

leecode原题

题目

给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。

  • 如果剩余字符少于 k 个,则将剩余字符全部反转。
  • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例

示例 1:

输入:s = "abcdefg", k = 2
输出:"bacdfeg"

示例 2:

输入: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--
    }
}
Copyright © ROSEMARY666 2022 all right reserved,powered by Gitbook该文章修订时间: 2022-09-28 15:55:21

results matching ""

    No results matching ""