题目来源
辅助阅读
我们都知道string和slice相似,都是一个结构体,引用了底层数组,并记录了自身的长度等信息。
在开始做这题前,你应该明白的几个知识点,string、rune、byte以及中文在string中的存储。
string的底层其实就是字节数组,也就是uint8,表示的范围有限,因此如果要正确的表示一个汉字(3个字节,Unicode),那么这个数组就会比正常的要长三倍。
在go中还有这么一个类型rune,它是int32的别名,能完整表示Unicode的所有码点,为什么不用int呢,int也是32位呀,但是int在go中,如果是32位系统它是4字节,64位系统是4字节。也就是说这是不确定的
因为byte和rune本质上没有区别,只是范围不一样,那么我们可以用rune将string转为rune数组。接着遍历数组交换头尾两个位置就行了
类似的截取带有中文的string时,一样会得到预期以外的结果。因为只截取了部分的数据,并不完整
package main
import (
"fmt"
"os"
"bufio"
)
func main() {
var s string
reader := bufio.NewReader(os.Stdin)
fmt.Fscan(reader, &s)
tmp := []rune(s)
length := len(tmp)
for i := range tmp {
if i == length / 2 {
break;
}
tmp[i], tmp[length - i - 1] = tmp[length - i - 1], tmp[i]
}
fmt.Println(string(tmp))
}