leetcode541反转字符串II

leetcode541 Reverse String II

Posted by BY on June 12, 2019

前言

新的一年,好好学习。

正文

问题来源

本问题来自leetcode上的541题。

问题描述

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

示例 1:

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

分析:

func min(a, b int) int {
    if a < b {
        return a 
    }
    return b
}

func reverse(s string, ret []byte, start int, step int) {
    end := min(len(s), start+step)
    for i := 0; i < end-start; i++ {
        ret[start+i] = s[end-1-i]
    }
    end = min(len(s), start+2*step)
    for i := start+step; i < end; i++ {
        ret[i] = s[i]
    }
}

func reverseStr(s string, k int) string {
    l := len(s)
    ret := make([]byte, l)
    for i := 0; i < l; i = i + 2*k {
        reverse(s, ret, i, k)
    }
    return string(ret)
}
func reverseStr(s string, k int) string {
    t := []byte(s)
    for l := 0; ; l += 2 * k {
        r := l + k - 1
        if r >= len(t) {
            r = len(t) - 1
        }
        for i := l; i < r; i, r = i+1, r-1 {
            t[i], t[r] = t[r], t[i]
        }
        if (l + 2*k) >= len(t) {
            break
        }
    }
    return string(t)
}

总结:

勤思考。

结语

不管怎么样好好加油。