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

数据结构-数组

一,数组基础及注意事项

1,用来储存一组相同的类型的数据.
2,在内存中,分配连续的空姐,数组创建时要指定容量(大小).
3,创建格式: 数据类型 []数组名  int[] arr = new int[10] int[] arr2 = {1,2,3,4}.
4,索引--访问数组时通过索引进行操作.
(注意:一定要理解索引的含义,在数据结构的学习中基本每次都用,索引简单的可以理解为,待插入元素,即,还没有赋值的第一个元素.)
5.索引从0开始,最大为数组名.length-1;
6,常见的错误: NullPointException ArrayIndexOutOfBoundsException 即我们常说的空指针h=和越界.
7,常见的数组:字符串,对象数组,哈希表

二,演示数组的使用,及数组的方法使用

使用数组时,最重要的就是数组的 索引 ,通过索引可以对数组进行改和查操作。
接下来用图 来演示
1,向数组中添加元素
2,向指定位置添加元素

3,向数组头添加元素
4,获取指定位置的元素和修改指定位置的元素
5,包含、搜索和删除元素

首先:对int类型的数组进行操作

接下来让我们手撕代码.:

import java.util.Arrays;
import java.util.Random;// 封装属于自己的数组
public class MyArray {private int[] data; // 底层数据结构private int size;// 用来保存实际存放元素的个数public MyArray() {this(100);}public MyArray(int capacity) {this.data = new int[capacity];this.size = 0;}// 判断数组是否为空public boolean isEmpty() {return this.size == 0;}// 获取数组实际存放元素的个数public int getSize() {return this.size;}// 对数组进行操作/** 1、增加的方法发现:this.size指向待插入元素的位置,因此,可以在this.size位置增加元素在头部增加: 1》 将数组中的元素后移,2》 将val添加到索引为0的位置* 在任意位置添加*//*** 在尾部添加** @param val val*/public void addTail(int val) {add(this.size, val);}/*** 在头部添加** @param val val*/public void addHead(int val) {add(0, val);}/*** 在任意位置添加** @param position 插入的位置* @param val      插入的值*/public void add(int position, int val) {if (position < 0 || position > this.size) {throw new IllegalArgumentException("position is invalid");}for (int i = this.size - 1; i >= position; i--) {this.data[i + 1] = this.data[i];}this.data[position] = val;this.size += 1;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();for (int i = 0; i < this.size; i++) {sb.append(this.data[i] + ",");}String result = sb.toString();return result.substring(0, result.length() - 1);}//获取指定位置的元素public int getElementByIndex(int index) {if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid");}return this.data[index];}// 修改指定位置的元素public void setElementByIndex(int index, int val) {if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid");}this.data[index] = val;}// cotains 用来判断数组中是否包含指定的元素public boolean contains(int searchVal) {for (int i = 0; i < this.size; i++) {if (this.data[i] == searchVal) {return true;}}return false;}// 查找指定元素在数组中的索引public int findIndex(int searchVal) {for (int i = 0; i < this.size; i++) {if (this.data[i] == searchVal) {return i;}}return -1;}// 删除数组中最后一个元素public int removeFromTail() {if (isEmpty()) {throw new IllegalArgumentException("this array is null!");}return this.data[--this.size];}// 删除数组中的第一个元素public int removeFromHead() {if (isEmpty()) {throw new IllegalArgumentException("this array is null!");}// 1、先保存数组中的第一个元素int result = this.data[0];// 2、将数组从索引为1的位置进行前移for (int i = 1; i < this.size; i++) {this.data[i - 1] = this.data[i];}this.size--;return result;}// 删除指定位置的元素public int removeByIndex(int index) {if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid!");}int result = this.data[index];// 从索引为index位置的元素进行前移for (int i = index; i < this.size - 1; i++) {this.data[i] = this.data[i + 1];}this.size--;return result;}// 删除指定的元素public void remove(int val) {for (int i = 0; i < this.size; ) {if (this.data[i] == val) {// 删除元素---将后面的元素前移,然后更新sizefor (int j = i; j < this.size - 1; j++) {this.data[j] = this.data[j + 1];}this.size -= 1;} else {i++;}}}

}

我们要进行任意数据类型的数组,这时就要使用泛型来进行操作.

接下来让我们手撕代码.在上述我们自己写的int类型数组进行修改,添加泛型.

import java.util.Random;// 封装属于自己的数组,使用泛型
public class MyArray2<T> {private T[] data; // 底层数据结构private int size;// 用来保存实际存放元素的个数private int capacity; // 表示容积public MyArray2() {this(100);}public MyArray2(int capacity) {this.capacity = capacity;this.data = (T[]) new Object[this.capacity];this.size = 0;}// 获取容积的方法public int getCapacity() {return this.capacity;}// 判断数组是否为空public boolean isEmpty() {return this.size == 0;}// 获取数组实际存放元素的个数public int getSize() {return this.size;}// 对数组进行操作/** 1、增加的方法发现:this.size指向待插入元素的位置,因此,可以在this.size位置增加元素在头部增加: 1》 将数组中的元素后移,2》 将val添加到索引为0的位置* 在任意位置添加*//*** 在尾部添加** @param val val*/public void addTail(T val) {add(this.size, val);}/*** 在头部添加** @param val val*/public void addHead(T val) {add(0, val);}/*** 在任意位置添加** @param position 插入的位置* @param val      插入的值*/public void add(int position, T val) {if (position < 0 || position > this.size) {throw new IllegalArgumentException("position is invalid");}// 在增加之前,判断数组是否已满,如果已满,要进行扩容if (this.size == this.capacity) {// 扩容操作resize(this.capacity*2);}for (int i = this.size - 1; i >= position; i--) {this.data[i + 1] = this.data[i];}this.data[position] = val;this.size += 1;}// 改变容积的方法private void resize(int newCapacity) {System.out.println("--------resize--------");// 2、 创建一个新数组T[] newArr = (T[]) new Object[newCapacity];// 3、将原来数组的内容转移到新数组for (int i = 0; i < this.size; i++) {newArr[i] = this.data[i];}// 4、将newArr赋值给 this.datathis.data = newArr;// 5、将newCapacity 赋值给this.capacitythis.capacity = newCapacity;}@Overridepublic String toString() {StringBuilder sb = new StringBuilder();for (int i = 0; i < this.size; i++) {sb.append(this.data[i] + ",");}String result = sb.toString();return result.substring(0, result.length() - 1);}//获取指定位置的元素public T getElementByIndex(int index) {if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid");}return this.data[index];}// 修改指定位置的元素public void setElementByIndex(int index, T val) {if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid");}this.data[index] = val;}// cotains 用来判断数组中是否包含指定的元素public boolean contains(T searchVal) {for (int i = 0; i < this.size; i++) {if (this.data[i].equals(searchVal)) {return true;}}return false;}// 查找指定元素在数组中的索引public int findIndex(T searchVal) {for (int i = 0; i < this.size; i++) {if (this.data[i].equals(searchVal)) {return i;}}return -1;}// 删除数组中最后一个元素public T removeFromTail() {return removeByIndex(this.size-1);}// 删除数组中的第一个元素public T removeFromHead() {return removeByIndex(0);}// 删除指定位置的元素public T removeByIndex(int index) {if (index < 0 || index >= this.size) {throw new IllegalArgumentException("index is invalid!");}T result = this.data[index];// 从索引为index位置的元素进行前移for (int i = index; i < this.size - 1; i++) {this.data[i] = this.data[i + 1];}this.size--;if(this.size <= this.capacity/2 && this.capacity/2>1){resize(this.capacity/2);}return result;}// 删除指定的元素public void remove(int val) {for (int i = 0; i < this.size; ) {if (this.data[i].equals(val)) {// 删除元素---将后面的元素前移,然后更新sizefor (int j = i; j < this.size - 1; j++) {this.data[j] = this.data[j + 1];}this.size -= 1;} else {i++;}}// 删除之后,进行判断是否要进行缩容,如果需要缩容,缩到原容积的1/2if(this.size <= this.capacity/2 && this.capacity/2>1){resize(this.capacity/2);}}
}

代码较长希望有心人可以看完.

三,数组的复杂度分析.

我们对数组的逻辑有了简单的了解,就对数组的复杂度进行分析,后面可以通过比较复杂度,来选择合适的数据结构来储存数据.

1,分析动态数组的时间复杂度

(1),添加操作

 1,addLast(e) O(n)

2,addFirst(e)  O(1)  渐进时间复杂度

3,add(index,e) O(n^2) 描述n趋近于无穷的情况

(2),添加操作

(3),删除操作

(4),修改操作

(5),查找操作

(6) 综合

相关文章:

数据结构-数组

一,数组基础及注意事项 1,用来储存一组相同的类型的数据. 2,在内存中,分配连续的空姐,数组创建时要指定容量(大小). 3,创建格式: 数据类型 []数组名 int[] arr new int[10] int[] arr2 {1,2,3,4}. 4,索引--访问数组时通过索引进行操作. (注意:一定要理解索引的含义,在数据结…...

【Java程序设计】【C00279】基于Springboot的智慧外贸平台(有论文)

基于Springboot的智慧外贸平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的智慧外贸平台 本系统分为系统功能模块、管理员功能模块、买家功能模块以及商家功能模块。 系统功能模块&#xff1a;在平台首页可以…...

C#,计算几何,计算机图形学(Computer Graphics)洪水填充算法(Flood Fill Algorithm)与源代码

1 泛洪填充算法(Flood Fill Algorithm) 泛洪填充算法(Flood Fill Algorithm) &#xff0c;又称洪水填充算法&#xff0c;是在很多图形绘制软件中常用的填充算法&#xff0c;最熟悉不过就是 windows 自带画图软件的油漆桶功能。 2 源程序 using System; using System.Collecti…...

C# 实现网页内容保存为图片并生成压缩包

目录 应用场景 实现代码 扩展功能(生成压缩包) 小结 应用场景 我们在一个求职简历打印的项目功能里&#xff0c;需要根据一定的查询条件&#xff0c;得到结果并批量导出指定格式的文件。导出的格式可能有多种&#xff0c;比如WORD格式、EXCEL格式、PDF格式等&#xff0c;…...

C#_事件简述

事件模型简述 C#中事件的运行模式为"发布订阅模型"&#xff0c;事件触发者称为"发布者"&#xff0c;事件处理者称为"订阅者" 事件模型的五个组成部分 事件&#xff08;成员&#xff09;事件的拥有者&#xff08;类/对象&#xff09;事件的响应…...

C语言:指针(一)

目录 1.内存和地址2. 指针变量和地址2.1 取地址操作符&#xff08;&&#xff09;2.2 指针变量和解引用操作符&#xff08;*&#xff09;2.2.1 指针变量2.2.2 解引用操作符&#xff08;*&#xff09; 2.3 指针变量的大小 3.指针变量的类型和意义3.1 指针的解引用3.2 指针 -指…...

【leetcode刷题之路】面试经典150题(3)——哈希表+区间

文章目录 5 哈希表5.1 【哈希表】赎金信5.2 【数学】同构字符串5.3 【数学】单词规律5.4 【哈希表】有效的字母异位词5.5 【哈希表】字母异位词分组5.6 【双指针】两数之和5.7 【数学】快乐数5.8 【哈希表】219. 存在重复元素 II5.9 【数学】最长连续序列 6 区间6.1 【数学】汇…...

群晖NAS DSM7.2.1安装宝塔之后无法登陆账号密码问题解决

宝塔的安装就不在这赘述了&#xff0c;只说下&#xff0c;启动之后默认账号密码无法登陆的问题。 按照上面给出的账号密码&#xff0c;无法登陆 然后点忘记密码&#xff0c;由于是docker安装的&#xff0c;根目录下没有/www/server/panel 。 也没有bt命令 要怎么修改呢。 既然…...

9、使用 ChatGPT 的 GPT 制作自己的 GPT!

使用 ChatGPT 的 GPT 制作自己的 GPT! 想用自己的 GPT 超越 GPT ChatGPT 吗?那么让我们 GPT GPT 吧! 山姆 奥特曼利用这个机会在推特上宣传 GPTs 的同时还猛烈抨击了埃隆的格罗克。 GPTs概览 他们来了! 在上周刚刚宣布之后,OpenAI 现在推出了其雄心勃勃的新 ChatGPT…...

企业微信应用开发:使用Cpolar域名配置进行本地接口回调的调试指南

文章目录 1. Windows安装Cpolar2. 创建Cpolar域名3. 创建企业微信应用4. 定义回调本地接口5. 回调和可信域名接口校验6. 设置固定Cpolar域名7. 使用固定域名校验 企业微信开发者在应用的开发测试阶段&#xff0c;应用服务通常是部署在开发环境&#xff0c;在有数据回调的开发场…...

js 可选链运算符(?.)空值合并运算符(??)逻辑空赋值运算符(??=)

可选链运算符&#xff08;?.&#xff09;允许读取位于连接对象链深处的属性的值&#xff0c;而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符&#xff0c;不同之处在于&#xff0c;在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起…...

vue 手势解锁功能

效果 实现 <script setup lang"ts"> const canvasRef ref<HTMLCanvasElement>() const ctx ref<CanvasRenderingContext2D | null>(null) const width px2px(600) const height px2px(700) const radius ref(px2px(50))const init () > …...

介绍 CI / CD

目录 一、介绍 CI / CD 1、为什么要 CI / CD 方法简介 1、持续集成 2、持续交付 3、持续部署 2、GitLab CI / CD简介 3、GitLab CI / CD 的工作原理 4、基本CI / CD工作流程 5、首次设置 GitLab CI / CD 6、GitLab CI / CD功能集 一、介绍 CI / CD 在本文档中&#x…...

Stable Diffusion 3 Early Preview发布

2月22日&#xff0c;Stability AI 发布了 Stable Diffusion 3 early preview&#xff0c;这是一种开放权重的下一代图像合成模型。据报道&#xff0c;它继承了其前身&#xff0c;生成了详细的多主题图像&#xff0c;并提高了文本生成的质量和准确性。这一简短的公告并未附带公开…...

【解决(几乎)任何机器学习问题】:特征选择

当你创建了成千上万个特征后&#xff0c;就该从中挑选出⼏个了。但是&#xff0c;我们绝不应该创建成百上千个⽆⽤的特征。特征过多会带来⼀个众所周知的问题&#xff0c;即 "维度诅咒"。如果你有很多特征&#xff0c;你也必须有很多训练样本来捕捉所有特征。什么是 …...

24 双非计算机秋招总结

引言 我整理了一份 10w 字数的前端技术文档&#xff08;飞书&#xff09;&#xff0c;地址&#xff1a;https://qx8wba2yxsl.feishu.cn/docx/Vb5Zdq7CGoPAsZxMLztc53E1n0k?fromfrom_copylink&#xff0c;欢迎对前端感兴趣的同学查看、共建、分享。 PS&#xff1a;我是一名大四…...

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增

用友NC65与用友NCC对接集成NC65-凭证列表查询打通凭证新增 数据源平台:用友NC65 用友NC是为集团与行业企业提供的全线管理软件产品&#xff0c;由亚太本土最大的企业管理软件提供商用友公司研发提供&#xff0c;用友NC率先采用J2EE架构和先进开放的集团级开发平台UAP&#xff0…...

【初中生讲机器学习】12. 似然函数和极大似然估计:原理、应用与代码实现

创建时间&#xff1a;2024-02-23 最后编辑时间&#xff1a;2024-02-24 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…...

【达梦数据库】查看pesg回滚段信息的视图和SQL

一些达梦回滚段是使用情况的查询SQL&#xff0c;供排查“回滚记录版本太旧&#xff0c;无法获取用户记录” 等类似问题时使用 视图名说明主库备库v$pseg_items显示回滚系统中当前回滚项信息&#xff08;回滚线程的工作信息&#xff09;总行数WORKER_THREADS1查询 no rowsv$pseg…...

UML---活动图

活动图概述 活动图&#xff08;Activity Diagram&#xff09;是UML&#xff08;Unified Modeling Language&#xff0c;统一建模语言&#xff09;中的一种行为建模工具&#xff0c;主要用于描述系统或业务流程中的一系列活动或操作。活动图通常用于描述用例中的行为&#xff0c…...

RTX4090D显存优化:OpenClaw长文本处理实测Qwen3-32B性能

RTX4090D显存优化&#xff1a;OpenClaw长文本处理实测Qwen3-32B性能 1. 测试背景与实验设计 去年我在处理学术论文时&#xff0c;经常遇到需要分析几十页PDF的情况。传统工具要么截断文本&#xff0c;要么丢失关键上下文。当我发现OpenClaw支持本地部署大模型后&#xff0c;立…...

5年java开发经验总结面试题-内含完整答案

1、讲讲IO里面的常见类&#xff0c;字节流、字符流、接口、实现类、方法阻塞。 文件字节输入输出流 FileInputStream/FileOutputStream&#xff0c; 文件字符流 FileReader/FileWriter 包装流PrintStream/PrintWriter/Scanner 字符串输入输出流StringReader/StringWriter 转换流…...

CANdb++ Editor高效使用技巧:5个隐藏功能大幅提升dbc编辑效率

CANdb Editor高效使用技巧&#xff1a;5个隐藏功能大幅提升dbc编辑效率 在汽车电子开发领域&#xff0c;Vector的CANdb Editor堪称dbc文件编辑的行业标准工具。大多数工程师都能熟练使用其基础功能&#xff0c;但真正的高手往往掌握着那些鲜为人知的"秘密武器"。本文…...

设计师必看:Photoshop混合模式实战指南,5分钟搞定光影合成与氛围感调色

Photoshop混合模式实战指南&#xff1a;5分钟掌握光影合成与氛围调色 当你在深夜赶稿时&#xff0c;突然发现人物照片缺乏立体感&#xff0c;或是产品静物图需要增强戏剧性光影——这就是混合模式大显身手的时刻。不同于繁琐的曲线调整和复杂的蒙版操作&#xff0c;混合模式就像…...

Win11Debloat:一键清理Windows 11,让你的电脑重回清爽状态

Win11Debloat&#xff1a;一键清理Windows 11&#xff0c;让你的电脑重回清爽状态 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其…...

遇到“用户对AIAgent进行提示词注入”怎么办?

文章目录先理解什么是“提示词注入”图片里的防护方法&#xff08;两层&#xff09;第一层&#xff1a;System Prompt 先贴“封条”第二层&#xff1a;输出端再加“安检门”总结先理解什么是“提示词注入” 你可以把 Agent&#xff08;智能助手&#xff09; 想象成一个 严格遵…...

Null 安全的 BigDecimal 比较器

本文旨在解决这个问题 Java 中对包含 BigDecimal 排序类型对象列表时&#xff0c;如何处理可能出现的空指针异常。自定义 BigDecimal 并结合比较器 Comparator.nullsFirst 可以实现正确的方法 BigDecimal 空值安全排序字段&#xff0c;避免程序崩溃&#xff0c;确保排序结果的正…...

从硬件迷宫到macOS殿堂:OpCore Simplify如何重塑黑苹果配置体验

从硬件迷宫到macOS殿堂&#xff1a;OpCore Simplify如何重塑黑苹果配置体验 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 对于许多技术爱好者来说&a…...

哲学家吃饭问题没搞懂?用Python模拟信号量帮你彻底理解进程同步(附可运行代码)

用Python动态模拟哲学家进餐问题&#xff1a;从死锁到解决方案的完整实践指南 在操作系统的学习中&#xff0c;哲学家进餐问题堪称进程同步与死锁的"经典案例"。这个看似简单的场景却蕴含着并发编程中最棘手的挑战——如何协调多个进程对有限资源的访问。本文将带你…...

STM32CubeMX+Keil MDK联合开发:手把手教你配置蓝桥杯G431工程模板

STM32CubeMXKeil MDK联合开发&#xff1a;手把手教你配置蓝桥杯G431工程模板 对于参加蓝桥杯嵌入式赛道的选手来说&#xff0c;掌握STM32G431RBT6开发板的快速工程搭建是必备技能。本文将带你从零开始&#xff0c;通过STM32CubeMX和Keil MDK的协同工作&#xff0c;完成一个标准…...