题目
slice
测试文件我放在github中了,每个习题都有测试
练习 4.3: 重写reverse函数,使用数组指针代替slice。
func reverse(a *[5]int){
for i,j := 0,len(*a)-1; i<j; i,j = i+1,j-1 {
a[i], a[j] = a[j], a[i]
}
}
练习 4.4: 编写一个rotate函数,通过一次循环完成旋转。
func rotate(t []int,n int)[]int {
/*
这个地方我起初写成
tmp := t[:n]
测试是发现始终输出:[3,4,5,3,4]
才想起来这是 浅拷贝,是浮动的
正确使用要使用深拷贝去给tmp赋值
*/
tmp := make([]int,n)
copy(tmp,t[:n])
copy(t[:len(t)-n],t[n:])
copy(t[len(t)-n:],tmp[:])
return t
}
练习 4.5: 写一个函数在原地完成消除[]string中相邻重复的字符串的操作。
func unique(s []string) []string {
k := 0
for _,w :=range s{
if s[k]==w {
continue
}
k++
s[k]=w
}
return s[:k+1]
}
练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回
func replaceSpace(b []byte) []byte {
end :=len(b)
for i:=0;i<len(b) ;i++ {
if !unicode.IsSpace(rune(b[i])) {
continue
}else {
spaceCount :=0
cpyStart :=i
for unicode.IsSpace(rune(b[i])) {
i++
spaceCount++
}
end =end-spaceCount+1
copy(b[cpyStart:],b[cpyStart+spaceCount-1:])
i = cpyStart
}
}
return b[:end]
}
练习 4.7: 修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存?
func reverseInPlace(s []byte) []byte {
for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
s[i], s[j] = s[j], s[i]
}
return s[:]
}