剑指 Offer 58 - II. 左旋转字符串
1.
// 暴力,重新设置一个新的[]byte
func reverseLeftWords(s string, n int) string {
ss := []byte(s)
Len := len(ss)
ret := make([]byte, 0)
for i := n; i < Len; i++ {
ret = append(ret, ss[i])
}
for i := 0; i < n; i++ {
ret = append(ret, ss[i])
}
return string(ret)
}
2.
// 不能申请额外空间,只能在本串上操作
func reverseLeftWords(s string, n int) string {
b := []byte(s)
// 1. 反转前n个字符
// 2. 反转第n到end字符
// 3. 反转整个字符
reverse(b, 0, n-1)
reverse(b, n, len(b)-1)
reverse(b, 0, len(b)-1)
return string(b)
}
// 切片是引用传递
func reverse(b []byte, left, right int) {
for left < right {
b[left], b[right] = b[right], b[left]
left++
right--
}
}
核心思路:整体反转+局部反转