• [日常] 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]
        }
    }
    

      

  • 相关阅读:
    Angular 双向数据绑定
    Angular 过滤器
    Angular 自定义指令传参
    润滑油 标号
    Oracle concat
    sqlldr load UTF8 error
    linux中shell变量$#,$@,$0,$1,$2的含义解释
    shell 执行结果赋给变量
    linux 如何显示一个文件的某几行(中间几行)
    linux shell date 用当天时间做备份文件名
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8797499.html
Copyright © 2020-2023  润新知