剑指 Offer 58 - II. 左旋转字符串

809人浏览 / 0人评论

题目

字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。

比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。

示例 1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例 2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"

题解

思路一(切片特性)

获取字符串s[n:]和s[:n],再拼接即可

思路二(新建修改)

新建一个[]byte res,用来存储旋转之后的字符集,最终再将其转换成string

  • 从n开始遍历s到结尾,写入res
  • 从0开始遍历s到n,写入res

利用取余,可以将两步合入一次遍历操作

  • i从n到n+len(s)开始遍历,将s[i % len(s)]写入res

思路三(原地修改)

以n为分隔,前后两部分分别进行旋转,再将整个字符串进行旋转,三次旋转操作顺序可以随意,最终结果一致

.png

代码

切片特性

func reverseLeftWords1(s string, n int) string {
	return s[n:] + s[0:n]
}

新建修改

func reverseLeftWords2(s string, n int) string {
	res := make([]byte, len(s))
	for i := n; i < n+len(s); i++ {
		res[i-n] = s[i%len(s)]
	}
	return string(res)
}

原地修改

func reverseLeftWords3(s string, n int) string {
	res := []byte(s)
	reverse(res, 0, n-1)
	reverse(res, n, len(s)-1)
	reverse(res, 0, len(s)-1)
	return string(res)
}

func reverse(res []byte, m, n int) {
	for m < n {
		res[m], res[n] = res[n], res[m]
		m++
		n--
	}
}

全部评论