前言
新的一年,好好学习。
正文
问题来源
本问题来自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)
}
总结:
勤思考。
结语
不管怎么样好好加油。