加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

[日常] Go语言圣经-Slice切片习题

发布时间:2020-12-16 19:35:59 所属栏目:大数据 来源:网络整理
导读:1.Slice(切片)代表变长的序列,序列中每个元素都有相同的类型,一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已,slice的底层确实引用一个数组对象 2.内置的len和cap函数分别返回slice的长度和容量 3.s

1.Slice(切片)代表变长的序列,序列中每个元素都有相同的类型,一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已,slice的底层确实引用一个数组对象

2.内置的len和cap函数分别返回slice的长度和容量

3.s[i:j],从第i个元素开始到第j-1个元素的子序列,s[:]切片操作则是引用整个数组

4.slice值包含指向第一个slice元素的指针,因此向函数传递slice将允许在函数内部修改底层数组的元素

5.将slice元素循环向左旋转n个元素的方法是三次调用reverse反转函数,第一次是反转开头的n个元素,然后是反转剩下的元素,最后是反转整个slice的元素。

6.slice之间不能比较,因此我们不能使用==操作符来判断两个slice是否含有全部相等元素,slice唯一合法的比较操作是和nil比较

7.可以用[]int(nil)类型转换表达式来生成一个对应类型slice的nil值

8.测试一个slice是否是空的,使用len(s) == 0来判断

9.make函数创建一个指定元素类型、长度和容量的slice,make([]T,len)

10.内置的append函数用于向slice追加元素

11.[]rune("Hello,世界")? 字符串转rune类型的slice

12.我们并不知道append调用是否导致了内存的重新分配,因此我们也不能确认新的slice和原始的slice是否引用的是相同的底层数组空间,通常是将append返回的结果直接赋值给输入的slice变量

13.函数参数中的最后的“...”省略号表示接收变长的参数为slice,func appendInt(x []int,y ...int) []int {}

14.报错invalid indirect of s[j] (type int),使用数组指针的时候(*s)[0]

15.Slice内存技巧,

练习 4.3: 重写reverse函数,使用数组指针代替slice。

练习 4.4: 编写一个rotate函数,通过一次循环完成旋转。

练习 4.5: 写一个函数在原地完成消除[]string中相邻重复的字符串的操作。

练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回

练习 4.7: 修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存?

b:=[]string{"tao","taoshihan","shi","han"} emptyString(b) d:=[]byte("abc bcd wer sdsd taoshihan de") e:=emptyString2(d) fmt.Println(string(e)) f:=[]byte("abc bcd wer sdsd taoshihan de") reverse1(f) fmt.Println(string(f))

}
/
练习 4.3: 重写reverse函数,使用数组指针代替slice。
/
func reverse(s [5]int){
i,j := 0,len(
s)-1;
for i<j{
(s)[i],(s)[j]=(s)[j],(s)[i]
i+=1
j-=1
}
}
/
练习 4.4: 编写一个rotate函数,通过一次循环完成旋转。
/
func rotate(s []int,r int)[]int{
lens := len(s)
//创建一个空的指定长度的slice
res :=make([]int,lens)
for i:=0 ;i<lens;i++{
index := i+r
if index>=lens{
index=index-lens
}
res[i] = s[index]
}
return res
}
/
练习 4.5:写一个函数在原地完成消除[]string中相邻重复的字符串的操作。
/
func emptyString(s []string)[]string{
i:=0
index:=0
num := len(s)
for _,v :=range s{
index =i+1
if index>=num{
break
}
if v != s[index]{
s[i]=v
i++
}
}
fmt.Println(s[:i])
return s[:i]
}
/
练习 4.6: 编写一个函数,原地将一个UTF-8编码的[]byte类型的slice中相邻的空格(参考unicode.IsSpace)替换成一个空格返回
/
func emptyString2(s []byte)[]byte{
index:=0
num := len(s)
for i:=0;i<num;i++{
index =i+1
num = len(s)
if index>=num{
break
}
if unicode.IsSpace(rune(s[i])) && unicode.IsSpace(rune(s[index])){
//结合remove函数
copy(s[i:],s[index:])
s=s[:len(s)-1]
i--
}
}
return s
}
/
练习 4.7: 修改reverse函数用于原地反转UTF-8编码的[]byte。是否可以不用分配额外的内存?
/
func reverse1(s []byte) {
for i,len(s)-1; i < j; i,j = i+1,j-1 {
s[i],s[j] = s[j],s[i]
}
}

  

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读