Go中的切片
在golang中,切片的底層就是數(shù)組,切片是對底層數(shù)組的引用,當(dāng)傳遞一個(gè)切片給函數(shù)時(shí),實(shí)際上是傳遞了切片的引用。因此,在函數(shù)內(nèi)部修改切片的內(nèi)容會(huì)影響原始切片。
切片中增加元素
思路分析
- 先聲明并初始化一個(gè)長度為當(dāng)前切片長度+1的切片
- 首部添加:將其余全部向后移動(dòng)一位,然后給首位賦值即可。
- 尾部添加:直接給尾部賦值即可。
- 中間添加:先查找到要添加的位置,然后將添加位置后的元素全部向后移動(dòng)一位,然后給添加的位置賦值即可。
* 這里假定該切片是單調(diào)序列,為了提高查詢效率,使用二分法查找。
Go代碼
源碼地址: GitHub-golang版本文章來源:http://www.zghlxwxcb.cn/news/detail-645349.html
// 在數(shù)組首部插入元素
func AddFirstInArr(arr []int, val int) []int{
newArr := make([]int, len(arr)+1)
newArr[0] = val
// 下面for循環(huán)也可以換成內(nèi)置copy函數(shù):
// copy(newArr[1:], arr)
for i:=1;i<len(newArr);i++ {
newArr[i] = arr[i-1]
}
return newArr
}
// 在數(shù)組尾部插入元素
func AddLastInArr(arr []int, val int) []int{
newArr := make([]int, len(arr)+1)
// 下面for循環(huán)也可以換成內(nèi)置copy函數(shù):
// copy(newArr, arr)
for i:=0;i<len(arr);i++ {
newArr[i] = arr[i]
}
newArr[len(newArr)-1] = val
return newArr
}
// 在數(shù)組中間插入元素
func AddInArr(arr []int, val int) []int{
arrlen := len(arr)
left,right := 0, arrlen-1
// 假設(shè)應(yīng)該插到最后
findindex := arrlen
// 使用二分查找法找到val對應(yīng)的位置
// 升序
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循環(huán)也可以換成內(nèi)置copy函數(shù):
// 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
}
切片中刪除元素
思路分析
- 先判斷當(dāng)前切片長度是否為空,如果是空,則直接返回了,沒有元素可以刪除的。
- 然后要除切片,可以通過重新切片的方式實(shí)現(xiàn)。
- 首部刪除:直接使用切片做法 arr[1:]即可。(復(fù)雜化:將該切片除了首位其余全部想前移動(dòng)一位,然后 arr[:len(arr)-1])
- 尾部刪除:直接使用arr[:len(arr)-1]
- 中間刪除:先查找要?jiǎng)h除元素的位置索引,沒有找到則直接返回;找到了就將刪除位置后的所有元素都向前移動(dòng)一位,然后 arr[:len(arr)-1]
Go代碼
源碼地址: GitHub-golang版本文章來源地址http://www.zghlxwxcb.cn/news/detail-645349.html
// 刪除數(shù)組首位
func DelFirstInArr(arr []int) []int{
if len(arr) == 0 {
return arr
}
return arr[1:]
}
// 刪除數(shù)組末尾元素
func DelLastInArr(arr []int) []int{
if len(arr) == 0 {
return arr
}
return arr[:len(arr)-1]
}
// 刪除數(shù)組中間元素
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("數(shù)組中不存在要?jiǎng)h除的元素 ", val)
return arr
}
// 將要?jiǎng)h除元素后的所有元素都往前移動(dòng)一位
copy(arr[findindex:], arr[findindex+1:])
return arr[:arrlen-1]
}
到了這里,關(guān)于[Go版]算法通關(guān)村第三關(guān)青銅——不簡單的數(shù)組增刪改查的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!