当前位置: 首页 > news >正文

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

线性表基础

线性表概念

线性表就是具有相同特征数据元素的一个有限序列,其中包含元素的个数称为线性表的长度

线性表类型

 从不同的角度看,线性表有不同的分类

语言实现角度

顺序表有两种实现方式

一体式

分离式 

image.png

一体式结构

        一体式:存储信息的单元 和 元素存储区  以连续的方式被安排在一块存储区里,两部分数据的整体形成一个完整的顺序表对象。

        这种结构整体性强,易于管理,但是由于数据元素存储区是表对象的一部分,顺序表创建后,元素存储区就固定了

        C和C++都是一体式的结构 

分离式结构 

        分离式:表对象里只保存与整个表有关的信息(容量和元素个数),实际数据元素被放在另一个独立的元素存储区里,通过连接与基本表对象关联

        Java和Python是分离式结构

存储角度 

顺序型

链表型

顺序型存储

        顺序型:就是将数据存放在一段固定的区域内,此时访问元素的效率非常高,但是删除和增加元素代价比较大,如果要扩容,只能整体搬迁。

链表型存储

         链表型:元素之间是通过地址一次连接的,因此访问时必须从头开始逐步向后找,查找效率低;而删除和增加元素非常方便,并且也不需要考虑扩容的问题。

        链表型的常见实现方式有:单链表、循环链表、双向链表等。

访问限制的角度

受限线性表

        栈和队列被称为访问受限的线性表。因为它们的  插入和删除操作受到了限制,只能在固定的位置进行。 

        Hash比较特殊, 其内部真正存储数据的一般是数组,但是访问是通过映射来实现的,因此大部分材料中并不将Hash归结到线程表中

扩容角度

动态顺序表

        采用分离式结构的顺序表,若将数据区更换为存储空间更大的区域,则可在不改变表对象的前提下对其数据存储区进行扩充,所有使用这个表的地方都不必修改,只要程序的运行环境还有空闲存储。

        这种表结构不会因满了二导致操作无法进行,人们把采用这种技术实现的顺序表称为动态顺序表,因为其容量可以在使用中动态变化。 

 扩充的策略
  • 每次扩充增加固定数目的存储位置

        如:每次扩充增加10个元素位置,这种策略称为线性增长。

        特点:节省空间,但是扩充操作频繁,操作次数多。

  • 每次扩充容量加倍

        如:每次扩容增加一倍的存储空间。

        特点:减少了扩充操作的执行次数,但可能会浪费空间资源。是以空间换时间,推荐的方式

线程表的操作

        线性表的常见操作有初始化、求表长、增删改查等。事实上,每种数据结构都至少要有这几种操作,大部分的基础算法题都是基于此扩展的 

线性表的操作如下

image.png

数组的概念

数组是线性表最基本的结构,特点是元素是一个紧密在一起的序列。相互之间不需要记录彼此的关系就能访问。

数组中要注意的点

  • 数组下标从0开始记录
    • 例:第一个存储元素的位置是a[0],最后一个元素位置是a[length - 1]
  • 数组中的元素在内存中是连续存储的,且每个元素占用着相同大小的内存
  • 数组空间不一定是满的
    • 例:空间为100的数组,可能只用了10个位置(数组中的元素数量),所以要注意数据个数的变量是size,数组长度length 可能不一样。

数组存储元素的特征

        数组存储元素的过程 

  • 一,我创建了一个大小为10的数组,请问此时数组里面是什么?
  • 答: 不同的语言处理会不一样,在c语言里每个位置都是一个随机数。而在java里,默认会初始化为0。而python更为灵活可以直接指定是什么,例如a =[1,2,3,4],就是数组里有四个元素,而a = [O for i in range(10)]这样定义的数组就是[0,0,0,0,0,,0,0,0, 0]

  • 二: 是否可以只初始化一部分位置?
  • 初始化的本质是什么?答: 当然可以,你可以将前面5个位置依次,后面的空着,此时数组内容为[1,2,3,4,5,0,0,0,0,0,1],初始化的本质就是覆盖已有的值,用你需要的值覆盖原来的0,因为数组本来是{0,0,0,0,0,0,0,0,0,0},这里只不过被你替换成了{1,2,3,4,5,0,0,0,0,0}。如果此时你想知道有效元素的个数,就必须再使用一个额外的变量,例如size来标记。

  • 三.上面已经初始化的元素之间是否可以空着,例如初始化为{1,0,0,4,5,0,2,0,3,0}。其中0位置仍然是未初始化的?
  • 答:不可以!绝对不可以!要初始化,就必须从前向后的连续空间初始化,不可以出现空缺的情况,这是违背数组的原则的。你正在进行某种运算期间可以先给部分位置赋值,而一旦稳定了,就不可以再出现空位置的情况。

  • 四: 如果我需要的数据就是在中间某一段该怎么办呢? 例如r0,0,3,4,5,6,7,0,0,01,此时该怎么拿到从3到7的元素呢?
  • 答:你需要使用两个变量,例如left=2,right=6来表示区间[left,right]是有效的。

  • 五: 我删除的时候,已经被删除的位置该是什么呢? 例如原始数组为{1,2,3,4,5,6,7,8,0,01,我删除4之后,根据数组的移动原则,从5开始向前移动变成{1,2,3,5,6,7,8,?,0,0},那原来8所在的位置应该是什么呢?
  • 答:仍然是8,也就是删除4之后的结构为(1,2,3,5,6,7,8,8,0,0},此时表示元素数量的size会减1变成7,原来8的位置仍然是8。因为我们是通过size来标记元素数量的,所以最后一个8不会被访问到。

  • 第六炮: 这个里8看起来很不爽啊,是否可以再优化一下?
  • 答: 不爽就不爽,习惯就好!不用优化,优化了也没啥用

数组的基本操作

数组的重要性

为什么数组的题目特别多呢,因为很多题目本质就是查找问题,而数组是查找的最佳载体。很多复杂的算法都是为了提高查找效率的,例如二分查找、二叉树红黑树、B+树、Hash和堆等等。另一方面很多算法问题本质上都是查找问题例如滑动窗口问题、回溯问题、动态规划问题等等都是在寻找那个目标结果。

查找一个元素

进行等值的线性查找,题目:

        如果数组是递增的,此时查找时如果相等 或者 当前位置元素比目标值更大就停下来,使用代码实现

实现代码 

    /***  如果数组是递增的,此时查找时如果相等 或者 当前位置元素比目标值更大就停下来,使用代码实现* @param arr 给定的数组* @param size 数组中以存在的元素长度* @param element 待查找的元素* @return  该元素*/public int findElement(int [] arr ,int size , int element){for (int i = 0; i < size; i++) {if (arr[i] == element){return i;}else if (arr[i] > element){return -1;}}return -1;}

增加一个元素

题目:

        将给定的元素插入到有序的数组的对应位置中

实现方法一

    /***  题目*  将给定的元素插入到有序的数组的对应位置中* @param arr  有序数组* @param size 数组已经存储的元素数量(从1开始计算)* @param element 要插入的元素* @return 插入元素的下标*/public int addElementSequence(int [] arr , int size , int element){// 判断边界if (size >= arr.length){return -1;}// 定义插入元素的下标int index = size;// 通过循环,找到比要插入元素小的位置,将下标赋值for (int i = 0; i < size; i++) {if (arr[i] > element){index = i;break;}}// 元素往后移for (int i = size; i > index ; i --) {// 后移一个位置arr[i] = arr[i--];}// 将下标为index的元素设为elementarr[index] = element;return index;}

实现方法二

 

    public int addElementSequenceFromEnd(int [] arr , int size , int element){if (size >= arr.length){return -1;}int index = 0;for (int a : arr) {if (a <= element){index++;}else {arr[index] = element;break;}}return index;}

删除一个元素

题目:删除一个元素

代码实现

   /*** 删除一个元素* @param arr 给定的数组* @param size 数组中元素的个数* @param element 要删除的元素* @return 删除元素后数组的长度*/public int removeElement(int [] arr , int size , int element){int index = -1;// 如果存在,找到该元素,并设置该元素下标for (int i = 0; i < size; i++) {if (arr[i] == element){index = i;}}// 如果找到元素,index就不等于-1;如果没找到,就等于默认值-1,直接退出if ( index != -1){//for (int i = index +1; i < size; i++) {arr[i-1] = arr[i];}// 长度减一size--;}return size;}

单调数组问题

题目:

        判断一个数组是否是单调递增的

方法一

    /*** 题目* 判断一个数组是否是单调递增的* @param arrs 给定的数组* @return 是/否  单调递增*/public boolean isMonotonic(int [] arrs){return isSort(arrs,true)|| isSort(arrs,false);}public boolean isSort(int [] nums , boolean increasing){int length = nums.length;for (int i = 0; i < length - 1; i++) {if (increasing){if (nums [i] > nums[i+1] ){return false;}}else {if (nums[i] < nums[i+1]){return false;}}}return true;}

 方法二(优化):

    public boolean isMonotonicByOntMethod(int [] arr){boolean inc = true, dec = true;for (int i = 0; i < arr.length -1; i++) {if (arr[i] > arr[i+1]){inc = false;}if (arr[i] < arr[i+1]){dec = false;}}// 如果是单调的 ,返回结果为true;如果不是单调的,返回结果为falsereturn inc || dec;}

题目:

        给定一个潘旭数组和一个目标值,在数组中找打目标值,并党徽其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置

   /*** 题目:* 给定一个潘旭数组和一个目标值,在数组中找打目标值,并党徽其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置* @param nums 有序数组* @param target 要插入数组中的目标值* @return 目标值的索引*/public int searchInsert(int [] nums , int target){int length = nums.length;int left = 0 , right = length -1 , index = length;while (left <= right){int mid = ((right - left) / 2)+ left;if (target <= nums [mid] ){index = mid;right = mid -1;} else {left = mid + 1;}}return index;}

 

数组合并问题 

相关文章:

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

线性表基础 线性表概念 线性表就是具有相同特征数据元素的一个有限序列&#xff0c;其中包含元素的个数称为线性表的长度 线性表类型 从不同的角度看&#xff0c;线性表有不同的分类 语言实现角度 顺序表有两种实现方式 一体式 分离式 一体式结构 一体式&#xff1a;存储信息…...

【Linux】动静态库

目录 写在前面的话 如何编写静态库库 编写静态库 ar命令 Makefile自动化形成静态库 如何使用编写的静态库 1.拷贝到系统路径中 2.指定路径搜索 如何编写动态库 编写动态库 完善Makefile 如何使用编写的动态库 指定路径搜索(不可行及原因) 环境变量LD_LIBRARY_PAT…...

《kubernetes权威指南》-第一章学习笔记

1.什么是kubernetes&#xff1f; kubernetes是一个全新的基于容器技术的分布式架构领先方案。 2.为什么要用kubernetes&#xff1f; 使用kubernetes提供的解决方案能够减少30%的开发成本&#xff0c;并且能够将开发人员的精力更加集中于业务本身&#xff0c;同时可以降低系统…...

ubuntu 18.04 磁盘太满无法进入系统

安装了一个压缩包&#xff0c;装了一半提示磁盘空间少导致安装失败。我也没在意&#xff0c;退出虚拟机打算扩展硬盘。等我在虚拟机设置中完成扩展操作&#xff0c;准备进入虚拟机内部进行操作时&#xff0c;发现登录不进去了 shift 登入GUN GRUB设置项的问题 网上都是在开机…...

基于LNMP配置WordPress建站时出现的问题汇总

目录 wordpress上传文件报错问题描述原因分析&#xff1a;解决方案&#xff1a; wordpress裁剪图片报错问题描述原因分析&#xff1a;解决方案&#xff1a; 配置固定链接和伪链接 wordpress上传文件报错 WP内部错误&#xff0c;在上传文件时发生了错误&#xff0c;显示权限不足…...

【Spring Cloud】Gateway的配置与使用

文章目录 前言第一步&#xff0c;创建一个springboot工程第二步&#xff0c;添加依赖第三步&#xff0c;编写yml文件第四步&#xff0c;启动主启动类总结 前言 Gateway其实是springcloud 原生的东西&#xff0c;但是我还是想放在这里讲&#xff0c;因为我们使用nacos时&#x…...

概念、框架简介--ruoyi学习(一)

开始进行ruoyi框架的学习&#xff0c;比起其他的前后端不分离的&#xff0c;这个起码看的清晰一些吧。 这一节主要是看了ruoyi的官方文档后&#xff0c;记录了以下不懂的概念&#xff0c;并且整理了ruoyi框架中的相关内容。 一些概念 前端 store store是状态管理库&#x…...

IDEA的基础使用——【初识IDEA】

IDEA的基础使用——【初识IDEA】 文章目录 IDEA简介前言官网 IDEA的下载与安装选择下载路径勾选自己需要的其余按默认选项进行即可 目录简介安装目录简介 运行Hello WorldIDEA快捷键常用模板模板一&#xff1a;psvm&#xff08;main&#xff09;模板二&#xff1a;模板三&#…...

LeetCode刷题总结-动态规划篇

LeetCode刷题总结-动态规划篇 本文总结LeetCode上有动态规划的算法题&#xff0c;推荐刷题总数为54道。具体考点分析如下图&#xff1a; 1.中心扩展法 题号&#xff1a;132. 分割回文串 II&#xff0c;难度困难 2.背包问题 题号&#xff1a;140. 单词拆分 II&#xff0c;难…...

el-table使用xlsx实现导入文件编辑功能

需求&#xff1a;列表根据xlsx文件导入后&#xff0c;和列表进行对比&#xff0c;之后实现编辑功能 1.下载xlsx 我下的是之前的版本&#xff0c;新版不知道兼不兼容&#xff0c;这个包900多k npm install xlsx0.14.5 2.在需要使用表格导入的页面引入 import XLSX from &quo…...

Android9、11 有线网络开关设置

Android9、11 有线网络开关设置 Android9、11 有线网络开关设置_android 以太网开关_峥嵘life的博客-CSDN博客...

【MySQL】mysql问题 | [ERROR] unknown variable ‘column-statistics=0‘

一、说明 1、用到一个开源项目&#xff0c;dbBkTool[asurplus] 2、这个项目用于MySQL定时备份的 3、然后有个执行的时候&#xff0c;发下报错 [ERROR] unknown variable column-statistics0 二、解决 1、把MySQL客户端升级到8.0.19之后&#xff0c;就不报错了 2、column-stat…...

ElasticSearch 7.x

前言 elastic表示可伸缩&#xff0c;search表示查询。所以es的核心即为查询。通常情况下&#xff0c;我们的数据可以分为三类&#xff1a;结构化数据、非结构化数据、半结构化数据。 结构化数据&#xff1a;一般会用特定的结构来组织和管理数据&#xff0c;表现为二维表结构。…...

MVC乱码问题

RequestMapping(value "insert",produces {"text/html;charsetutf-8"}) //前端响应回去加响应头&#xff0c;解决乱码问题,这个还跟JSP响应头还不一样&#xff0c;这是响应的字符串&#xff0c;纯文本&#xff0c;那个前端的是out.Writer()对象&#xff…...

1004. 最大连续1的个数 III

题目描述&#xff1a; 主要思路&#xff1a; 刚看到这个问题首先想到的是二分答案&#xff0c;二分长度&#xff0c;然后利用滑动窗口判断是否可以达成。 class Solution { public:bool find(int x,vector<int> nums, int k){int now0;for(int i0,j0;i<nums.size();…...

【机器学习】西瓜书学习心得及课后习题参考答案—第3章线性模型

过了一遍第三章&#xff0c;大致理解了内容&#xff0c;认识了线性回归模型&#xff0c;对数几率回归模型&#xff0c;线性判别分析方法&#xff0c;以及多分类学习&#xff0c;其中有很多数学推理过程以参考他人现有思想为主&#xff0c;没有亲手去推。 术语学习 线性模型 l…...

面试官问我:一个 TCP 连接可以发多少个 HTTP 请求?我竟然回答不上来...

一道经典的面试题是从 URL 在浏览器被被输入到页面展现的过程中发生了什么&#xff0c;大多数回答都是说请求响应之后 DOM 怎么被构建&#xff0c;被绘制出来。但是你有没有想过&#xff0c;收到的 HTML 如果包含几十个图片标签&#xff0c;这些图片是以什么方式、什么顺序、建…...

树莓派Pico|RP2040|官方文档|在MS Windows上构建“Hello World”及环境配置

9.2. 在MS Windows上构建 在Microsoft Windows 10或Windows 11上安装工具链与其他平台有些不同。然而安装后&#xff0c;RP2040的构建代码基本类似。  警告 官方不支持在Windows 7或8上使用Raspberry Pi Pico&#xff0c;但在Windows 7或8上可以使其工作。 9.2.1. 安装工具…...

全球公链进展| 2023/7/31

一周速览 过去一周&#xff0c;明星项目动态如下&#xff1a; 第114次以太坊核心开发者共识会议&#xff1a;Devnet #8 最早下周推出 Layer2网络Shibarium跨链桥已上线公开测试 Optimism 推出「Law of Chains」v0.1 版本 Sui 通过 SIP#6 &#xff0c;允许开发人员构建流动…...

Spring源码(三)Spring Bean生命周期

Bean的生命周期就是指&#xff1a;在Spring中&#xff0c;一个Bean是如何生成的&#xff0c;如何销毁的 Bean生命周期流程图 1、生成BeanDefinition Spring启动的时候会进行扫描&#xff0c;会先调用org.springframework.context.annotation.ClassPathScanningCandidateCompo…...

变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析

一、变量声明设计&#xff1a;let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性&#xff0c;这种设计体现了语言的核心哲学。以下是深度解析&#xff1a; 1.1 设计理念剖析 安全优先原则&#xff1a;默认不可变强制开发者明确声明意图 let x 5; …...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?

一、核心优势&#xff1a;专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发&#xff0c;是一款收费低廉但功能全面的Windows NAS工具&#xff0c;主打“无学习成本部署” 。与其他NAS软件相比&#xff0c;其优势在于&#xff1a; 无需硬件改造&#xff1a;将任意W…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验

系列回顾&#xff1a; 在上一篇中&#xff0c;我们成功地为应用集成了数据库&#xff0c;并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了&#xff01;但是&#xff0c;如果你仔细审视那些 API&#xff0c;会发现它们还很“粗糙”&#xff1a;有…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

STM32---外部32.768K晶振(LSE)无法起振问题

晶振是否起振主要就检查两个1、晶振与MCU是否兼容&#xff1b;2、晶振的负载电容是否匹配 目录 一、判断晶振与MCU是否兼容 二、判断负载电容是否匹配 1. 晶振负载电容&#xff08;CL&#xff09;与匹配电容&#xff08;CL1、CL2&#xff09;的关系 2. 如何选择 CL1 和 CL…...