【数据结构】【数组与字符串】数组和字符串的常用操作以及常用技巧


字符串的常用操作

字符串转化为 字符数组 arrStrBytes := []byte(str)
字符数组转化为字符串 str :=string(arrStrBytes)
字符串截取 字符串截取和数组的截取是一样的 arrByte[low:high]

  • low表示起点,是包含这个字符的
  • hight 表示终点,是不包含这个字符的

字符串切割转化为数组 []string =strings.split(str,"分隔符 ")返回字符串数组
字符串到整型 int int64 int32 的转化 strconv.atoi(str,10) atoi 是strconv.parseInfo的精简版本
整型到字符串的转化 strconf.atoi(i int) strconf.FormatInt(i int64,int)
字符串的定义

  • var str = “hello word” (编译器会推导类型)
  • str :=“hello word”
  • var str int = 100

字符串的遍历 和 数组的遍历是一样的 str[i]
字符串的修改,a="hello word " go语言的字符串是无法直接修改字符的,只能通过重新构造然后赋值给原来字符串实现

  • arrByte:=[]byte(str) arrByte[0] = w str:=string(arrByte)
  • 字符串不可变和java是一样的,c++的字符串是可变的,字符串不可变有很多好处,如天生线程安全,大家使用的都是只读对象,无须加锁;再者,方便内存共享,而不必使用写时复制(Copy On Write)等技术;字符串 hash 值也只需要制作一份。所以说,代码中实际修改的是 []byte,[]byte 在 Go 语言中是可变的,本身就是一个切片

字符串的拼接

  • 用+进行链接
  • 用类似于stringBuilder机制来进行链接 var stringBuilder bytes.Buffer stringBuilder.WriteString(“hello”) str:=stringBuilder.string()

数组的常用操作

数组和切片

  • 数据是固定长度的 ,因此是固定长度,所以go语言中很少用数组,大多数用切片

数组的定义

  • 数组的定义1 var a [3]int 默认值3个的初始值都为0
  • 数组的定义2 a :=[…]int{1,2,3} 长度根据初始化值的个数来计算
  • 数组的定义3 var a[3]int=[3]int{1,2,3} var a =[3]int{1,2,3} a:=[3]int{1,2,3}

切片的定义

  • 数组的一个连续片段的引用,没有固定的长度
  • 从数组或切片中生成切片 a := a[0:2]; a[0:0] 重置切片 a[ : ]原来的切片
  • 直接声明切片 var a []int 只声明未初始化不能使用;因为是nil的(和数组有区别)
  • var b []int = []int{1,2,3} var c = []int{11,22,33} d :=[]int{111,222,333}
  • make构造切片 b := make([]int, 2, 10)

数组的常用操作

  • 使用append来为切片添加元素
    **a = append(a, 1) // 追加1个元素
    **a = append(a, 1, 2, 3) // 追加多个元素, 手写解包方式
    **a = append(a, []int{1,2,3}…) // 追加一个切片, 切片需要解包
  • 使用append从头部添加元素
    ** a = append([]int{0},a…) //在a头部添加一个元素
    ** a = append([]int{1,2,3),a…) //在a的头部添加一个切片
  • 使用append进行链式操作 达到中间插入的目的
    ** a = append(a[:i], append([]int{x}, a[i:]…)…) // 在第i个位置插入x
    **a = append(a[:i], append([]int{1,2,3}, a[i:]…)…) // 在第i个位置插入切片

切片的函数传递是直接传还是传带&符号的?

不说原理了,直接说结论,原理请自行百度或者google;如果函数中使用了切片的append方法,则需要传递地址,也就是带&符号的,接收以*指针形式接收。如果函数中对切片的使用未使用append方法,则直接传递就可以

算法中数组的一些奇淫技巧

  1. 双指针遍历,一个在开始位置,一个在结束位置;一般适用于只遍历数组一般就能得到结果
// 注意:这里end是length-1
start :=0
end := len(arr)-1
for end>start{
	// 一般这里是交换的一些操作
	start++
	end--
}
  1. 基于1的,大多数给的并不是数组的开始位置和结束位置;给的是数组中的一个start 和 end位置
这里的[start,end)是一个半开半闭的区间
middle :=(start+end)/2
for :=0;i<middle;i++{
	// 这里一般是交换
	end--
}

猜你喜欢

转载自blog.csdn.net/weixin_38024463/article/details/107771555