[日常] Go语言圣经-Slice切片习题
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。是否可以不用分配额外的内存?
- package main
- import(
- "fmt"
- "unicode"
- )
- func main(){
- testArr := [5]int{0,1,2,3,4}
- //reverse(&testArr)
- fmt.Println(testArr)
- a:=rotate(testArr[:],2)
- fmt.Println(a)
- b:=[]string{"tao","taoshihan","shi","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, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
- s[i], s[j] = s[j], s[i]
- }
- }
[日常] Go语言圣经-Slice切片习题的更多相关文章
- [日常] Go语言圣经-匿名函数习题
Go语言圣经-匿名函数1.拥有函数名的函数只能在包级语法块中被声明,通过函数字面量(function literal),我们可绕过这一限制,在任何表达式中表示一个函数值2.通过这种方式定义的函数可以访 ...
- [日常] Go语言圣经--接口约定习题
Go语言圣经-接口1.接口类型是对其它类型行为的抽象和概括2.Go语言中接口类型的独特之处在于它是满足隐式实现的3.Go语言中还存在着另外一种类型:接口类型.接口类型是一种抽象的类型4.一个类型可以自 ...
- [日常] Go语言圣经-错误,函数值习题
Go语言圣经-错误 1.panic异常.panic是来自被调函数的信号,表示发生了某个已知的bug 2.任何进行I/O操作的函数都会面临出现错误的可能 3.错误是软件包API和应用程序用户界面的一个重 ...
- [日常] Go语言圣经-字节切片与字符串
1.一个字符串是一个不可改变的字节序列2.文本字符串通常被解释为采用UTF8编码的Unicode码点(rune)序列3.内置的len函数可以返回一个字符串中的字节数目4.第i个字节并不一定是字符串的第 ...
- [日常] Go语言圣经--接口约定习题2
练习 7.3: 为在gopl.io/ch4/treesort (§4.4)的*tree类型实现一个String方法去展示tree类型的值序列. package main import( "f ...
- [日常] Go语言圣经-可变参数习题
1.参数数量可变的函数称为为可变参数函数,例子就是fmt.Printf和类似函数2.参数列表的最后一个参数类型之前加上省略符号“...”3.虽然在可变参数函数内部,...int 型参数的行为看起来很像 ...
- [日常] Go语言圣经-竞争条件习题
package main import( "fmt" "sync" ) var balance int func Deposit(amount int) { b ...
- [日常] Go语言圣经-匿名函数习题2
练习5.13: 修改crawl,使其能保存发现的页面,必要时,可以创建目录来保存这些页面.只保存来自原始域名下的页面.假设初始页面在golang.org下,就不 要保存vimeo.com下的页面. p ...
- [日常] Go语言圣经-函数递归习题
练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...
随机推荐
- 重写TreeView,自定义图标,生成通行的下划线,取消默认获得焦点失去焦点的效果,并支持拖拽节点到外界
1.运行效果: 2.前端代码 <UserControl x:Class="iPIS.UI.Base.Tree.VideoTreeControl" xmlns="ht ...
- VS2015ASP.NET MVC5项目中Spring.NET配置方法(超详细)
首先,在ASP.NET MVC5项目右键,如下图所示,选择“管理Nuget程序包...” 然后,在弹出的页面的搜索框中输入“spring.web”,在返回结果中选择Spring.Web和Spring. ...
- ionic 图片轮播ion-slide-box问题
1.使用ion-slide可以实现图片轮播,但是如果在html中仅仅增加ion-slide是远远不够的,会出现两个问题: (注:使用的是angularjs.首先需要在,js文件中注入:$ionicSl ...
- 【Vue】浅谈Vue不同场景下组件间的数据交流
浅谈Vue不同场景下组件间的数据“交流” Vue的官方文档可以说是很详细了.在我看来,它和react等其他框架文档一样,讲述的方式的更多的是“方法论”,而不是“场景论”,这也就导致了:我们在阅读完 ...
- jmeter 中 浮点数计算精度问题
jmeter 中 浮点数计算精度问题解决方法: 编写 beanshell 时使用 java.math.BigDecimal 方法构造,使用 BigDecimal 并且一定要用 String 来够造. ...
- 【May Be DNK】JSON.parse() and JSON.stringify()的两个实用技巧
结论 一.数据深拷贝 使用方法:JSON.parse(JSON.stringify(param)) let o = {a: 1, b: 2} let o1 = JSON.parse(JSON.stri ...
- JAVA JDK的安装及初步试用
1.进入浏览器输入下图网址进入相关页面 2.网站主界面如图 3.单击箭头所指功能块 4.选择如下图的对应选项 5.进入如下页面后单击下图红色框 6.进入如下页面后单击如下红色框进行下载 7.下载好之 ...
- Android MediaPlayer setDataSource failed
今天在尝试使用MediaPlayer播放音乐时出了一个问题,在使用 mp.setDataSource(this,Uri.parse("/sdcard/Music/adele.mp3" ...
- iOS---代理、协议、通知 详解
一.代理 1.代理的介绍 代理是一种通用的设计模式 代理使用方式:A 让 B 做件事,空口无凭,签个协议. 所以代理有三部分组成: 委托方: 定义协议 协议 : 用来规定代理方可以做什么,必须做什 ...
- 关于SVM(support vector machine)----支持向量机的一个故事
一.预告篇: 很久很久以前,有个SVM, 然后,……………………被deep learning 杀死了…………………………………… . 完结……撒花 二.正式篇 好吧,关于支持向量机有一个故事 ,故事是 ...