国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

[Go版]算法通關(guān)村第三關(guān)青銅——不簡單的數(shù)組增刪改查

這篇具有很好參考價(jià)值的文章主要介紹了[Go版]算法通關(guān)村第三關(guān)青銅——不簡單的數(shù)組增刪改查。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

Go中的切片

在golang中,切片的底層就是數(shù)組,切片是對底層數(shù)組的引用,當(dāng)傳遞一個(gè)切片給函數(shù)時(shí),實(shí)際上是傳遞了切片的引用。因此,在函數(shù)內(nèi)部修改切片的內(nèi)容會(huì)影響原始切片。
[Go版]算法通關(guān)村第三關(guān)青銅——不簡單的數(shù)組增刪改查,算法與數(shù)據(jù)結(jié)構(gòu),golang,算法

切片中增加元素

思路分析

  1. 先聲明并初始化一個(gè)長度為當(dāng)前切片長度+1的切片
  2. 首部添加:將其余全部向后移動(dòng)一位,然后給首位賦值即可。
  3. 尾部添加:直接給尾部賦值即可。
  4. 中間添加:先查找到要添加的位置,然后將添加位置后的元素全部向后移動(dòng)一位,然后給添加的位置賦值即可。
    * 這里假定該切片是單調(diào)序列,為了提高查詢效率,使用二分法查找。

Go代碼

源碼地址: GitHub-golang版本

// 在數(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
}

切片中刪除元素

思路分析

  1. 先判斷當(dāng)前切片長度是否為空,如果是空,則直接返回了,沒有元素可以刪除的。
  2. 然后要除切片,可以通過重新切片的方式實(shí)現(xiàn)。
  3. 首部刪除:直接使用切片做法 arr[1:]即可。(復(fù)雜化:將該切片除了首位其余全部想前移動(dòng)一位,然后 arr[:len(arr)-1])
  4. 尾部刪除:直接使用arr[:len(arr)-1]
  5. 中間刪除:先查找要?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)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 編程導(dǎo)航算法通關(guān)村第1關(guān) | 青銅:單鏈表的增刪改查

    鏈表中的每一個(gè)節(jié)點(diǎn)包含數(shù)據(jù)域和指針域 (構(gòu)造在一個(gè) struct 中),數(shù)據(jù)變量存儲(chǔ)數(shù)據(jù),指針變量存儲(chǔ)下一個(gè)節(jié)點(diǎn)的地址。 鏈表的一個(gè)節(jié)點(diǎn)只能有一個(gè)后繼 特點(diǎn): 鏈表節(jié)點(diǎn)在內(nèi)存中的位置可以不連續(xù)。 思路: 用 struct 包裝節(jié)點(diǎn) :成員包括數(shù)據(jù)和地址 用 class 包裝鏈表 :成員有

    2024年02月13日
    瀏覽(18)
  • [Go版]算法通關(guān)村第一關(guān)青銅——鏈表青銅挑戰(zhàn)筆記

    [Go版]算法通關(guān)村第一關(guān)青銅——鏈表青銅挑戰(zhàn)筆記

    單向鏈表圖示: 雙向鏈表圖示: 環(huán)形單向鏈表圖示: 環(huán)形雙向鏈表圖示: 源碼地址: GitHub-golang版本 如果是單向的,需要將當(dāng)前節(jié)點(diǎn) 定位到要插入節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn) ,否則一旦過了將無法回頭找到前一個(gè)節(jié)點(diǎn) 如果是雙向的,將當(dāng)前節(jié)點(diǎn) 定位到要插入節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)、

    2024年02月13日
    瀏覽(21)
  • [Go版]算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記

    [Go版]算法通關(guān)村第一關(guān)——鏈表青銅挑戰(zhàn)筆記

    單向鏈表圖示: 雙向鏈表圖示: 環(huán)形單向鏈表圖示: 環(huán)形雙向鏈表圖示: 源碼地址: GitHub-golang版本 如果是單向的,需要將當(dāng)前節(jié)點(diǎn) 定位到要插入節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn) ,否則一旦過了將無法回頭找到前一個(gè)節(jié)點(diǎn) 如果是雙向的,將當(dāng)前節(jié)點(diǎn) 定位到要插入節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)、

    2024年02月15日
    瀏覽(21)
  • [Go版]算法通關(guān)村第十三關(guān)黃金——數(shù)字?jǐn)?shù)學(xué)問題之?dāng)?shù)論問題(最大公約數(shù)、素?cái)?shù)、埃氏篩、丑數(shù))

    [Go版]算法通關(guān)村第十三關(guān)黃金——數(shù)字?jǐn)?shù)學(xué)問題之?dāng)?shù)論問題(最大公約數(shù)、素?cái)?shù)、埃氏篩、丑數(shù))

    題目鏈接:LeetCode-1979. 找出數(shù)組的最大公約數(shù) 輾轉(zhuǎn)相除法其核心部分為:若r 是a ÷ b的余數(shù),則 gcd(a, b)=gcd(b, r) 題目鏈接:LeetCode-204. 計(jì)數(shù)質(zhì)數(shù) 如果 x 是質(zhì)數(shù),那么大于 x 的 x 的倍數(shù) 2x,3x,… 一定不是質(zhì)數(shù)。 時(shí)間復(fù)雜度分析: 外層循環(huán)的迭代次數(shù)是 n-2,即 O ( n ) O(n) O ( n ) 次

    2024年02月11日
    瀏覽(24)
  • [Go版]算法通關(guān)村第二關(guān)青銅——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    [Go版]算法通關(guān)村第二關(guān)青銅——終于學(xué)會(huì)鏈表反轉(zhuǎn)了

    題目鏈接:LeetCode-206. 反轉(zhuǎn)鏈表 源碼地址:GitHub-golang版本 說明:遍歷該鏈表,依次取出當(dāng)前節(jié)點(diǎn)插入到新鏈表的首位(虛擬頭結(jié)點(diǎn)緊后)即可, 注意要提前保存當(dāng)前節(jié)點(diǎn)的Next數(shù)據(jù) ,否則插入到新鏈表后就沒法繼續(xù)向下遍歷了。 說明:原理和方法1一致,只不過現(xiàn)在沒有虛擬

    2024年02月13日
    瀏覽(19)
  • 算法通關(guān)村第十七關(guān):青銅挑戰(zhàn)-貪心其實(shí)很簡單

    算法通關(guān)村第十七關(guān):青銅挑戰(zhàn)-貪心其實(shí)很簡單

    1. 難以解釋的貪心算法 貪心學(xué)習(xí)法則:直接做題,不考慮貪不貪心 貪心(貪婪)算法 是指在問題盡心求解時(shí),在每一步選擇中都采取最好或者最優(yōu)(最有利)的選擇,從而希望能夠?qū)е陆Y(jié)果最好或者最優(yōu)的算法 貪心算法所得到的結(jié)果不一定是最優(yōu)的結(jié)果,但是都是相對近似最

    2024年02月09日
    瀏覽(28)
  • 算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動(dòng)窗口其實(shí)很簡單

    算法通關(guān)村第十六關(guān):青銅挑戰(zhàn)-滑動(dòng)窗口其實(shí)很簡單

    1. 滑動(dòng)窗口基本思想 數(shù)組引入雙指針的背景: 很多算法會(huì)大量移動(dòng)數(shù)組中的元素,頻繁移動(dòng)元素會(huì)導(dǎo)致執(zhí)行效率低下或者超時(shí),使用兩個(gè)變量能比較好的解決很多相關(guān)問題 數(shù)組雙指針,之前介紹過 對撞型 和 快慢型 兩種,滑動(dòng)窗口思想就是快慢型的特例 滑動(dòng)窗口 示例:

    2024年02月09日
    瀏覽(27)
  • [Go版]算法通關(guān)村第十五關(guān)青銅——用4KB內(nèi)存尋找重復(fù)元素

    在 海量數(shù)據(jù) 中,此時(shí)普通的數(shù)組、鏈表、Hash、樹等等結(jié)構(gòu)有無效了 ,因?yàn)閮?nèi)存空間放不下了。而常規(guī)的遞歸、排序,回溯、貪心和動(dòng)態(tài)規(guī)劃等思想也無效了,因?yàn)閳?zhí)行都會(huì)超時(shí),必須另外想辦法。這類問題該如何下手呢?這里介紹三種非常典型的思路: 使用位存儲(chǔ) ,使用

    2024年02月11日
    瀏覽(36)
  • 算法通關(guān)村十三關(guān) | 輾轉(zhuǎn)相除法、素?cái)?shù)和丑數(shù)

    算法通關(guān)村十三關(guān) | 輾轉(zhuǎn)相除法、素?cái)?shù)和丑數(shù)

    ? ? ? ? 輾轉(zhuǎn)相除法又稱歐幾里得算法,求兩個(gè)數(shù)的最大公因數(shù),希臘數(shù)學(xué)家喜歡用圖形來處理問題,于是 將要求最大公約數(shù)問題轉(zhuǎn)化為,以兩個(gè)數(shù)字構(gòu)成矩形,尋找可以鋪滿整個(gè)矩形的最大正方形的邊長問題。 例如8和12的最大公因數(shù)是4,記作gcd(8,12)=4,輾轉(zhuǎn)相除法的規(guī)則

    2024年02月09日
    瀏覽(21)
  • 算法通關(guān)村|青銅挑戰(zhàn)----鏈表

    前言:數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ):創(chuàng)建+增刪改查 學(xué)習(xí)目標(biāo):單鏈表的創(chuàng)建+增刪改查,雙鏈表的創(chuàng)建+增刪改查 數(shù)據(jù)域+指針域 數(shù)據(jù)域:當(dāng)前節(jié)點(diǎn)的元素值 指針域:當(dāng)前節(jié)點(diǎn)保存的下一個(gè)節(jié)點(diǎn)的元素的地址,其中最后一個(gè)元素的指針域指向null 標(biāo)準(zhǔn)的面向?qū)ο蟮墓?jié)點(diǎn)的定義: LeetCode中節(jié)

    2024年02月15日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包