Day09 字符串 part2

33 阅读4分钟

概念

将输入的内容赋值给变量

import "fmt"

var s string
var i int

fmt.Scanln("&s")
fmt.Scanln("&i")

golang如何将字符串反转

golang的字符串是不可变量,必须转换为[]rune 或者[]byte 才可以变换位置

参考:

www.php.cn/faq/516365.…

刷题

151.翻转字符串里的单词

leetcode.cn/problems/re…

使用 strings.Fields(s string) string

image.png

使用string截取字节

image.png

卡码网 55. 右旋转字符串

image.png

思路: 本题中,我们需要将字符串右移n位,字符串相当于分成了两个部分,如果n为2,符串相当于分成了两个部分

右移n位, 就是将第二段放在前面,第一段放在后面,先不考虑里面字符的顺序,是不是整体倒叙不就行了。

此时第一段和第二段的顺序是我们想要的,但里面的字符位置被我们倒叙,那么此时我们在把 第一段和第二段里面的字符再倒叙一把,这样字符顺序不就正确了。 如图:

image.png

总结

双指针总结

programmercarl.com/%E5%8F%8C%E…

slice 切片

slice的数据结构:

type slice struct {
	array unsafe.Pointer
	len int
	cap int
}


slice 的创建

  1. 使用字面量初始化切片
s := []int{1, 2, 3}
// 这种方式直接声明一个切片并通过大括号将元素值初始化。
  1. 使用make

s := make([]int, 5)
//这里创建了一个长度为5的切片,并将每个元素都作为int类型的零值
s := make([]int, 5, 10)
//这里创建了一个容量为10,长度为5的切片,5个元素是int类型的零值
  1. 创建空切片和nil切片

nil切片应该是指没有初始化过的切片,它的指针是nil,长度和容量都是0。而空切片可能是初始化了但里面没有元素的切片,比如用make创建但长度为0,或者直接使用字面量初始化如s := []int{}。这时候切片的指针可能指向一个空数组,或者某个特定的地址,但长度和容量都是0。

var s []int   // 分配一个nil切片
s := []int{}      // 分配一个空切片
s := make([]int, 0)     // 分配一个空切片

slice是值传递

slice在做为参数传递的时候是值传递,列如:

func Test_slice(t *testing.T) {

    s := []int{1,2}
   fmt.Printf("切片的地址:%p\n", &s)
   Zhi(s)
}

func Zhi(s []int) {
   fmt.Printf("切片的地址:%p\n", &s)
}
输出为:
切片的地址:0xc000008138
切片的地址:0xc000008168
可以发现两个数组的地址是不同的,slice在作为参数传递的时候,会拷贝一份传递过去

那这里引入一个问题

func Test_slice(t *testing.T) {

   s1 := []int{1, 2}
   Zhi(s1)
   fmt.Printf("切片的地址:%p\n,%v", &s1, s1)

}

func Zhi(s2 []int) {
   s2[0] = 2
   s2[1] = 1
   fmt.Printf("切片的地址:%p\n,%v", &s2, s2)
}

1.这个时候两个数组打印出的元素会是什么?


切片的地址:0xc000008150
,[2 1]
切片的地址:0xc000008138
,[2 1]
按理来说如果是值传递,那么s1打印的应该是[1,2],s2但是的是[2,1],但是很奇怪s1,s2打印的都是[2,1]
这是因为虽然slice是值传递,但是他是浅拷贝,他拷贝的是slice结构体里面三个字段的值,而第一个字段存的是指向数组首位的指针,在拷贝之后依旧指向的是同一个内存地址
导致两个数组实际上是使用的同一片空间,所以在更改s2的值之后,s1也会发生变化

那么对代码进行些许改动这个时候s1,s2输出的又会是什么

func Test_slice(t *testing.T) {

   s1 := []int{1, 2}
   Zhi(s1)
   fmt.Printf("切片的地址s1:%p\n,%v", &s1, s1)

}

func Zhi(s2 []int) {
   s2 = append(s2, 1)
   s2[0] = 2
   s2[1] = 1
   fmt.Printf("切片的地址s2:%p\n,%v", &s2, s2)
}


切片的地址s2:0xc000008150
,[2 1 1]
切片的地址s1:0xc000008138
,[1 2]
可以发现对s2添加一个元素之后,s2发生了变化,但是s1没有发生变化

参考: blog.csdn.net/qq_46596746…