-
Notifications
You must be signed in to change notification settings - Fork 0
/
level1.go
218 lines (198 loc) · 5.13 KB
/
level1.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
package level1
import (
"fmt"
)
// 在数组首部插入元素
func AddFirstInArr(arr []int, val int) []int{
newArr := make([]int, len(arr)+1)
newArr[0] = val
// 下面for循环也可以换成内置copy函数:
// copy(newArr[1:], arr)
for i:=1;i<len(newArr);i++ {
newArr[i] = arr[i-1]
}
return newArr
}
// 在数组尾部插入元素
func AddLastInArr(arr []int, val int) []int{
newArr := make([]int, len(arr)+1)
// 下面for循环也可以换成内置copy函数:
// copy(newArr, arr)
for i:=0;i<len(arr);i++ {
newArr[i] = arr[i]
}
newArr[len(newArr)-1] = val
return newArr
}
// 在数组中间插入元素
func AddInArr(arr []int, val int) []int{
arrlen := len(arr)
left,right := 0, arrlen-1
// 假设应该插到最后
findindex := arrlen
// 使用二分查找法找到val对应的位置
// 升序
if arr[left] <= arr[right] {
for left <= right {
mid := (right-left)/2+left
if val <= arr[mid] {
right = mid-1
findindex = mid
} else {
left = mid+1
}
}
} else {
for left <= right {
mid := (right-left)/2+left
if val >= arr[mid] {
right = mid-1
findindex = mid
} else {
left = mid+1
}
}
}
newArr := make([]int, arrlen+1)
// 下面for循环也可以换成内置copy函数:
// copy(newArr[:findindex], arr)
// copy(newArr[findindex+1:], arr[findindex:])
for i:=0;i<arrlen;i++ {
if i < findindex {
newArr[i] = arr[i]
} else {
newArr[i+1] = arr[i]
}
}
newArr[findindex] = val
return newArr
}
// 删除数组首位
func DelFirstInArr(arr []int) []int{
if len(arr) == 0 {
return arr
}
return arr[1:]
}
// 删除数组末尾元素
func DelLastInArr(arr []int) []int{
if len(arr) == 0 {
return arr
}
return arr[:len(arr)-1]
}
// 删除数组中间元素
func DelInArr(arr []int, val int) []int{
arrlen := len(arr)
if arrlen == 0 {
return arr
}
findindex := -1
for i, k := range arr {
if k == val {
findindex = i
break
}
}
if findindex == -1 {
fmt.Println("数组中不存在要删除的元素 ", val)
return arr
}
// 将要删除元素后的所有元素都往前移动一位
copy(arr[findindex:], arr[findindex+1:])
return arr[:arrlen-1]
}
func A() {
fmt.Println("slice := arr[:3]")
arr := [6]int{1,2,3,4,5,6}
slice := arr[:3]
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("")
fmt.Println("slice[0] = 10")
slice[0] = 10
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("")
fmt.Println("arr[1] = 11")
arr[1] = 11
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("")
fmt.Println("arr[5] = 12")
arr[5] = 12
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("")
fmt.Println("slice2 := slice[1:] slice2[0] = 40")
slice2 := slice[1:]
slice2[0] = 40
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("slice2=",slice2)
fmt.Println("")
fmt.Println("slice = append(slice, 50)")
slice = append(slice, 50)
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("slice2=",slice2)
fmt.Println("")
fmt.Println("slice2 = append(slice2, 60)")
slice2 = append(slice2, 60)
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("slice2=",slice2)
fmt.Println("")
/**
从以上测试可以发现:
通过切片方式从数组上获得的切片,那这个切片的底层数组就是这个数组,也就是说之后对该切片做了任何赋值、append的操作都会影响到原来的数组。
即使从这个切片上再切片出来的切片,修改也是一样的同步到底层数组以及其所有的引用切片上。
append是为了扩容,底层原理是新构造一个数组,然后将原来数组的值都拷贝过来,然后将所有的引用也同步到新的数组,之后的修改,不仅会影响所有切片,原始的数组也一样受影响
copy只是做值拷贝,不会影响原数组或切片
*/
fmt.Println("slice3 := make([]int, 6) copy(slice3, slice)")
slice3 := make([]int, 6)
copy(slice3, slice)
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("slice2=",slice2)
fmt.Println("slice3=",slice3)
fmt.Println("")
fmt.Println("slice3[0] = 80")
slice3[0] = 80
fmt.Println("arr=",arr)
fmt.Println("slice=",slice)
fmt.Println("slice2=",slice2)
fmt.Println("slice3=",slice3)
fmt.Println("")
// arr := make([]int, 7 ,10)
// arr[0] = 0
// arr[1] = 1
// arr[2] = 2
// arr[3] = 3
// fmt.Printf("arr=%#v \n", arr)
// fmt.Printf("arr.len=%d \n", len(arr))
// fmt.Printf("arr.cap=%d \n", cap(arr))
// fmt.Println("")
// arr[4] = 4
// fmt.Printf("arr=%#v \n", arr)
// fmt.Printf("arr.len=%d \n", len(arr))
// fmt.Printf("arr.cap=%d \n", cap(arr))
// fmt.Println("")
// arr[6] = 6
// fmt.Printf("arr=%#v \n", arr)
// fmt.Printf("arr.len=%d \n", len(arr))
// fmt.Printf("arr.cap=%d \n", cap(arr))
// fmt.Println("")
// arr = arr[:len(arr)-1]
// fmt.Printf("arr=%#v \n", arr)
// fmt.Printf("arr.len=%d \n", len(arr))
// fmt.Printf("arr.cap=%d \n", cap(arr))
// fmt.Println("")
// newArr := make([]int, 10, 11)
// copy(newArr, arr[:len(arr)-1])
// fmt.Printf("newArr=%#v \n", newArr)
// fmt.Printf("newArr.len=%d \n", len(newArr))
// fmt.Printf("newArr.cap=%d \n", cap(newArr))
// fmt.Println("")
}