Go语言面试题:翻转字符串

1,073 阅读1分钟

问题描述

请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。

解题思路

由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将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