[Go版]算法通关村第三关青铜——不简单的数组增删改查

这篇具有很好参考价值的文章主要介绍了[Go版]算法通关村第三关青铜——不简单的数组增删改查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Go中的切片

在golang中,切片的底层就是数组,切片是对底层数组的引用,当传递一个切片给函数时,实际上是传递了切片的引用。因此,在函数内部修改切片的内容会影响原始切片。
[Go版]算法通关村第三关青铜——不简单的数组增删改查,算法与数据结构,golang,算法

切片中增加元素

思路分析

  1. 先声明并初始化一个长度为当前切片长度+1的切片
  2. 首部添加:将其余全部向后移动一位,然后给首位赋值即可。
  3. 尾部添加:直接给尾部赋值即可。
  4. 中间添加:先查找到要添加的位置,然后将添加位置后的元素全部向后移动一位,然后给添加的位置赋值即可。
    * 这里假定该切片是单调序列,为了提高查询效率,使用二分法查找。

Go代码

源码地址: GitHub-golang版本

// 在数组首部插入元素
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
}

切片中删除元素

思路分析

  1. 先判断当前切片长度是否为空,如果是空,则直接返回了,没有元素可以删除的。
  2. 然后要除切片,可以通过重新切片的方式实现。
  3. 首部删除:直接使用切片做法 arr[1:]即可。(复杂化:将该切片除了首位其余全部想前移动一位,然后 arr[:len(arr)-1])
  4. 尾部删除:直接使用arr[:len(arr)-1]
  5. 中间删除:先查找要删除元素的位置索引,没有找到则直接返回;找到了就将删除位置后的所有元素都向前移动一位,然后 arr[:len(arr)-1]

Go代码

源码地址: GitHub-golang版本文章来源地址https://www.toymoban.com/news/detail-645349.html

// 删除数组首位
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]
}

到了这里,关于[Go版]算法通关村第三关青铜——不简单的数组增删改查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 编程导航算法通关村第1关 | 青铜:单链表的增删改查

    链表中的每一个节点包含数据域和指针域 (构造在一个 struct 中),数据变量存储数据,指针变量存储下一个节点的地址。 链表的一个节点只能有一个后继 特点: 链表节点在内存中的位置可以不连续。 思路: 用 struct 包装节点 :成员包括数据和地址 用 class 包装链表 :成员有

    2024年02月13日
    浏览(28)
  • [Go版]算法通关村第一关青铜——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月13日
    浏览(29)
  • [Go版]算法通关村第一关——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月15日
    浏览(36)
  • [Go版]算法通关村第十三关黄金——数字数学问题之数论问题(最大公约数、素数、埃氏筛、丑数)

    题目链接:LeetCode-1979. 找出数组的最大公约数 辗转相除法其核心部分为:若r 是a ÷ b的余数,则 gcd(a, b)=gcd(b, r) 题目链接:LeetCode-204. 计数质数 如果 x 是质数,那么大于 x 的 x 的倍数 2x,3x,… 一定不是质数。 时间复杂度分析: 外层循环的迭代次数是 n-2,即 O ( n ) O(n) O ( n ) 次

    2024年02月11日
    浏览(28)
  • [Go版]算法通关村第二关青铜——终于学会链表反转了

    题目链接:LeetCode-206. 反转链表 源码地址:GitHub-golang版本 说明:遍历该链表,依次取出当前节点插入到新链表的首位(虚拟头结点紧后)即可, 注意要提前保存当前节点的Next数据 ,否则插入到新链表后就没法继续向下遍历了。 说明:原理和方法1一致,只不过现在没有虚拟

    2024年02月13日
    浏览(24)
  • 算法通关村第十七关:青铜挑战-贪心其实很简单

    1. 难以解释的贪心算法 贪心学习法则:直接做题,不考虑贪不贪心 贪心(贪婪)算法 是指在问题尽心求解时,在每一步选择中都采取最好或者最优(最有利)的选择,从而希望能够导致结果最好或者最优的算法 贪心算法所得到的结果不一定是最优的结果,但是都是相对近似最

    2024年02月09日
    浏览(30)
  • 算法通关村第十六关:青铜挑战-滑动窗口其实很简单

    1. 滑动窗口基本思想 数组引入双指针的背景: 很多算法会大量移动数组中的元素,频繁移动元素会导致执行效率低下或者超时,使用两个变量能比较好的解决很多相关问题 数组双指针,之前介绍过 对撞型 和 快慢型 两种,滑动窗口思想就是快慢型的特例 滑动窗口 示例:

    2024年02月09日
    浏览(34)
  • [Go版]算法通关村第十五关青铜——用4KB内存寻找重复元素

    在 海量数据 中,此时普通的数组、链表、Hash、树等等结构有无效了 ,因为内存空间放不下了。而常规的递归、排序,回溯、贪心和动态规划等思想也无效了,因为执行都会超时,必须另外想办法。这类问题该如何下手呢?这里介绍三种非常典型的思路: 使用位存储 ,使用

    2024年02月11日
    浏览(33)
  • 算法通关村十三关 | 辗转相除法、素数和丑数

            辗转相除法又称欧几里得算法,求两个数的最大公因数,希腊数学家喜欢用图形来处理问题,于是 将要求最大公约数问题转化为,以两个数字构成矩形,寻找可以铺满整个矩形的最大正方形的边长问题。 例如8和12的最大公因数是4,记作gcd(8,12)=4,辗转相除法的规则

    2024年02月09日
    浏览(40)
  • 算法通关村|青铜挑战----链表

    前言:数据结构的基础:创建+增删改查 学习目标:单链表的创建+增删改查,双链表的创建+增删改查 数据域+指针域 数据域:当前节点的元素值 指针域:当前节点保存的下一个节点的元素的地址,其中最后一个元素的指针域指向null 标准的面向对象的节点的定义: LeetCode中节

    2024年02月15日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包