LeetCode 剑指 Offer 58 - II. 左旋转字符串
题目链接:LeetCode 剑指 Offer 58 - II. 左旋转字符串
题意:
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
解题思路:
暴力做法:
一个for循环遍历字符串,每次将前n个字符追加到尾部,最后截取第n个字符后面部分
代码如下:
func reverseLeftWords(s string, n int) string {
ss:=[]byte(s)
for i:=0;i<n;i++{
tmp:=ss[i]
ss =append(ss,tmp)
}
ss = ss[n:]
return string(ss)
}
极简切片做法:
重组原切片,直接将前n个字符拼接在原后面字符的后面
代码如下:
func reverseLeftWords(s string, n int) string {
s=s[n:]+s[:n]
return s
}
反转字符做法:
思路类似于LeetCode 151. 反转字符串中的单词,
- 反转前n个字符
- 反转第n到end字符
- 反转整个字符
注意:这里的顺序就不能交换了,因为如果先反转整个字符串,此时前n个字符已经不是原字符,
代码如下:
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--
}
}