问题描述
请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。
解题思路
由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将str[len]赋值给str[0],将str[0]赋值str[len]。
注意:字符串中可能含有中文符号,所以必须将string转换成rune类型。
func reverseString(s *string) {
str := []rune(*s)
n := len(str)
for i := 0; i < n / 2; i++ {
str[i], str[n - i - 1] = str[n - i - 1], str[i]
}
*s = string(str)
}
测试
s := "123456789"
reverseString(&s)
fmt.Println(s)
// 输出:
// 987654321
扩展
假设我们已经有了这么一个反转字符串的函数reverseString(),假设一个字符串的长度为n,我们想要利用其将一个字符串中的前m个字符放到字符串的尾端,那我们应该怎么做呢?
例如:将123456789变为456789123
我们可以将前三个字符翻转,再将后六个字符翻转,最后翻转整个字符串即可。
s := "123456789"
s1 := s[:3]
s2 := s[3:]
reverseString(&s1)
reverseString(&s2)
s = s1 + s2
reverseString(&s)
fmt.Println(s)
// 输出:
// 456789123