03 数据、切片的概念

03 数组、切片的概念

定义数组

var arr1 [5]int
arr2 := [3]int{1,2,3}
arr3 :=[...]int{2,4,6,8,10}
var grid [3][4]int

fmt.Println(arr1,arr2,arr3)
fmt.Println(grid)

数组的遍历

//下表和数值
    for _,v := range arr3{
        fmt.Println(v)  }

    maxIndex := -1
    maxValue := -1
    for i,v := range arr3{
        if v > maxValue{
            maxIndex , maxValue = i,v
        }
    }
  • 可通过_省略变量
  • 不仅range,任何地方都可以通过_省略变量
  • 如果只要i,可写成for i := range numbers

为什么要用range

  • 意义明确,美观
  • c++,没有类似的能力
  • java/python,只能for each value,不知同时获取i,v

数组是值类型

  • [10]int和[20]int是不同类型
  • 调用func f(arr [10]int)会拷贝数组
  • 在go语言中一般不直接使用数组

切片(Slice)的概念

注意的是切片是半开半闭区间的

Reslice
s := arr[2:6]
s = arr[:3]
s = arr[1:]
s = arr[:]
arr := [...]int{0,1,2,3,4,5,6,7}
fmt.Println("ReSlice operation====")
fmt.Println("arr[:] : ",arr)
s1 := arr[2:6]
fmt.Println("arr[2:6] : ",s1)
s2 := s1[3:5]
fmt.Println("s[3:5] : ",s2)

这里s2的结果,明显是数组是对s1越界了,但是还是可以打印出来,打印的结果还是可以打印出来!

Slice的实现

  • slice可以向后扩展,但是不可以向前扩展
  • s[i] 不可以超越len(s),向后扩展不可以超越底层数组cap(s)
  • cap的大小和ptr的起始位置有关,这个说明了,只能向后扩展,不能向前扩展

向Slice添加元素

fmt.Println("Add element to array")
s3 := arr[4:7]
fmt.Println(s3)
//No longer view arr , will new a space and copy s3
s4 := append(s3, 10)
fmt.Println(s4)
s5 := append(s4, 11)
fmt.Println(s5)
  • 添加元素时如果超越cap,系统会重新分配更大的底层数组
  • 由于值传递的关系,必须接受append的返回值
  • s = append(s,val)

对Slice切片进行操作

fmt.Println("Deteling Slice ")
//实现思路是一直append,跳过删除的元素,append可以使用可变参数
delete := s2[3]
fmt.Println("Detele elment is " , delete)
s2 = append(s2[:3],s2[4:]...)
printSlices(s2)


fmt.Println("Poping elment form front")
front := s2[0]
fmt.Println("pop element is ",front)
s2 = append(s2[1:])
printSlices(s2)

fmt.Println("Poping elment form back")
back := s2[len(s2)-1]
fmt.Println("pop element is ",back)
s2 = append(s2[:len(s2)-1])
printSlices(s2)

Map

m := map[string]string{
        "name" : "ccmouse",
        "cource" : "golang",
        "site" : "imooc",
        "quality" : "notebad",

    }
  • map[K]V,map[K1]map[K2]V
  • 创建: make(map[string]string)
  • 获取元素:m[key]
  • key不存在时,获取Value类型的初始值
  • 用Value,ok := m[key] 来判断是否存在key

Map的遍历

  • 使用range 遍历key,或者遍历key,value对
  • 不保证遍历顺序,如需顺序,需要手动对key进行排序
  • 使用len来获取map的元素个数
fmt.Println("Getting value")
    if courseName, ok := m["caourse"]; ok{
        fmt.Println(courseName)  //如果是不存在的value,会打印" "
    }else{
        fmt.Println("key dose not exist")
    }

map的key

  • map使用哈希表,必须可以比较相等
  • 除了slice,map,function的内建类型之外,都可以作为key
  • Struct类型不包含上述字段,也可以作为key

例子:寻找最长不含有重复字符的子串

  • abcabcbb -> abc
  • bbbbb -> b
  • pwwkew -> wke

https://leetcode.com/
对于每一个字母X

  • lastOccured[x] 不存在,或者小于start的位置,无需操作
  • lastOccurred[x] >= start ,更新start
  • 更新lastOccurred[x],更新maxLength

你可能感兴趣的:(Go)