算法通关村——不简单的数组增删改查

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

1.1 初识数组

数组作为最基础,最常用的数据结构,大多数人可能会觉得它很简单,但是,你真的了解数组吗?看完这篇文章,带你认识更深层次的数组。

首先我们要知道,数组是什么呢?数组是存放相同数据类型元素的集合,我们可以通过索引来访问数组,需要注意的是,数组中第一个元素的索引为0,最后一个元素的索引是size-1;并且,数组中的元素在内存中是连续存放的,且每个元素占用相同大小的内存,如图所示:

算法通关村——不简单的数组增删改查,算法

1.2 数组基本操作

1.2.1 数组创建和初始化 

数组的初始化方法通常分为以下几种:

  • int arr[] = {1,3,4,6,7,8,9}  //这是很常用的一种初始化方法,根据赋值元素的个数默认数组初始化大小
  • int arr[10] = {1,2,3,4,5,6} //这种初始化方法直接指定了数组的大小,若初始化时未完全初始化,则后续内容自动补0
  • for(int i = 0;i<n;i++)  arr[i] = i; //这是利用循环赋值进行初识化,但数据比较固定,不适用于大多数情况

1.2.2 查找一个元素 

数组相对于链表最大的特点就是可以直接通过下标查找元素,基本实现如下:

int findByElement(int arr[],int size,int key)
{
    for(int i = 0;i<size;i++)
    {
        if(arr[i] == key)
        {
            return i;
        }
    }
    return -1;
}

1.2.3 增加一个元素 

这个问题看似简单,但数组的边界问题很多人都会忽视,所以一定要亲手实现一次,不能感觉简单就不写。数组的插入分为以下三步:1.找到插入位置 2.插入位置之后的元素整体右移 3.将元素插入到空位置上,基本实现如下:

int addByElement(int arr[],int size,int ele)
{
    if(size >= sizeof(arr) / sizeof(arr[0])
    {
         return -1;
    }
    int index = size  //问题一:为什么index要初始化为size
    for(int i = 0;i<size;i++)//问题二:这里是否可以是size-1
    {
        if(ele < arr[i])
        {
            index = i;
            break;
        }
    }
    for(int j = size;j>index;j--) //问题三,j为什么初始化为size
    {  
        arr[j] = arr[j-1];
    }
    arr[index] = ele;
    return index;
}

对于以上三个问题,请大家认真思考后再看解答,解答如下:

1.这里只能令index = size,0 或者 size - 1均不可以,为什么呢?假设序列有序,若在循环中无法找到合适的位置插入,则必须插入到元素的末尾,例如:已知序列为{3,4,7,8},如果插入的元素比8大,例如9,如果index初始化为0,则最后结果是{9,3,4,7,8};如果index初始化为size - 1,则最后结果为{3,4,7,9,8} ,显而易见,两种答案均错误。

2.这里不能初始化为size- 1,若初始化为size-1,则下标为size- 1的元素不会被遍历。

3.j为什么要初始化为size呢?因为在插入元素之后,实际上我们用到的空间比之前多了一个,所以下标的size的空间就需要用来存放下标为size-1的元素。

1.2.4 删除一个元素

理解插入元素之后,删除元素就变得十分简单了,删除元素只需两步:1.找到需要删除的元素 2.将删除位置之后的元素全部向前移动一格,基本实现如下:文章来源地址https://www.toymoban.com/news/detail-653983.html

int deleteByelement(int arr[], int size, int key, int length)
{
	int index = -1;
	for (int i = 0; i < size; i++)
	{
		if (key == arr[i])
		{
			index = i;
			break;
		}
	}
	if (index != -1)
	{
		for (int j = index + 1; j < size;j++)
		{
			arr[j - 1] = arr[j];
		}
		size--;
	}
	return size;
}

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

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

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

相关文章

  • 算法通关村-----数组实现加法专题问题解析

    给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头。详见leetcode66 可以从数组的末尾,即length-1下标处开始向前遍历,末尾元素➕

    2024年02月10日
    浏览(38)
  • 算法通关村十三关 | 数组字符串加法专题

    题目:LeetCode66,66. 加一 - 力扣(LeetCode) 我们只需要从头到尾依次运算,用常量标记是否进位,需要考虑的特殊情况是digits = [9,9,9]的时候进位,我们组要创建长度加1的数组,首位添加为1即可。         给定两个非负形式的字符串num1和num2,计算他们的和以字符串形式返

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

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

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

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

    2024年02月09日
    浏览(34)
  • 算法通关村第十四关——解析堆在数组中找第K大的元素的应用

    力扣215题 , 给定整数数组nums和整数k,请返回数组中第k个最大的元素。 请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。 分析 :按照“找最大用小堆,找最小用大堆,找中间用两个堆”,这道题用最小堆来解决,构造一个大小只有K的最小堆

    2024年02月07日
    浏览(27)
  • 算法通关村第十二关——不简单的字符串转换问题

    字符串是我们在日常开发中最常处理的数据,虽然它本身不是一种数据结构,但是由于其可以包含所有信息,所以通常作为数据的一种形式出现,由于不同语言创建和管理字符串的方式也各有差异,因此针对不同语言特征又产生了很多问题。 常见的字符串转换题目,也就是在

    2024年02月10日
    浏览(35)
  • 【数据结构与算法】1、学习动态数组数据结构(基本模拟实现 Java 的 ArrayList 实现增删改查)

    🍃 数据结构是 计算机 存储 、 组织 数据的方式 🎉 线性 结构 线性表(数组、链表、栈、队列、哈希表) 🎉 树形 结构 二叉树 AVL 树 红黑树 B 树 堆 Trie 哈夫曼树 并查集 🎉 图形 结构 邻接矩阵 邻接表 🎁 线性表是具有 n 个 相同类型元素 的有限 序列 (n = 0) a1 是首节点

    2024年02月10日
    浏览(63)
  • Shell脚本实现数组冒泡排序等简单算法排序

    目录 一、冒泡排序 1.简介 2.基本思想 3.算法思路 4.shell脚本实现 二、选择排序 1.简介 2.基本思想 3.shell脚本实现 三、插入排序 1.算法思路 2.shell脚本实现 四、反转排序 1.作用 2.shell脚本实现 类似气泡上涌的动作,会将数据在数组中从小到大或者从大到小不断的向前移动。 冒

    2024年02月09日
    浏览(94)
  • 数据结构-串-KMP算法详解(Next数组计算)(简单易懂)

    本文章就专讲kmp,暴力匹配就不讲了(我相信能搜索kmp的,暴力匹配算法应该也都了解过了) 为什么网上那么多讲kmp 我还发文章,很多文章我觉得讲的不是太通俗易懂,大多数我看起来都觉得有些懵逼 提示:以下信息来源百度 KMP算法是一种改进的字符串匹配算法,由D.E.K

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

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

    2024年02月15日
    浏览(26)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包