数据结构(数组)

一.数组的概念


    1. 数组定义

        数组(Array)是一种线性结构。它用一组连续的内存空间,来存储一组具有相同数据类型的数据。


   2. 数组的特点

        ①用来存储一组类型相同的数据。

        ②在内存中,分配连续的空间,数组创建时需要指定容量。因为数组为了保持内存的数据的连续性,所以会导致插入、删除这两个操作比较低效。

        ③数据类型[] 数组名 int[] arr = new int[10]; int[] arr2 = {1,2,3,4};

        ④访问数组中的数据时,通过索引访问,这也是数组的一大优点,可以实现随机访问(通过索引,时间复杂度为O(1)),所以随机访问时,效率比较高。 所以,数组是适合查找操作的,但查找的时间复杂度并不是O(1),即使是排好序的数组,使用二分查找法,时间复杂度也是(logn)。

        ⑤索引从0开始,最大到数组长度-1。索引从0开始,是因为索引(数组元素下标),确切的来说应该叫做偏移量,例如,arr[0]就表示偏移量为0的元素,也就是首地址。arr[k]就表示偏移量为k个type_size的位置。

        ⑥常见异常:NullPointException(空指针异常)、ArrayIndexOutOfBoundsException(数组索引越界异常)。

package com.gty.algo.lesson;import java.util.Arrays;public class ArrayDemo1 {public static void main(String[] args) {// 1.创建数组int[] arr = {11, 9, 1, 2, 26, 12};// 2.访问指定位置的值int num = arr[0]; //获取第一个位置的值System.out.println("num = " + num);// 3.修改指定位置的值arr[3] = 15;System.out.println("修改后的值为:" + arr[3]);// 4.遍历数组for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();// 5.数组中的异常(数组索引越界异常)System.out.println(arr[arr.length]); //ArrayIndexOutOfBoundsException// 空指针异常String[] s = new String[6];System.out.println(Arrays.toString(s)); //[null, null, null, null, null, null]System.out.println(s[0].length()); //NullPointerException}
}

注:

  • 数组是一段连续的内存空间,用户来存放具有相同数据类型的元素。
  • 在定义数组时,需要注意数组的类型和长度。类型决定了数组可以存储的元素的种类,长度定义了数组可以存储的元素的数量。
  • 在修改与访问数组时,要注意数组的索引,避免出现数组索引越界异常。在修改数组中的元素的值时,要注意数组中元素的数据类型,避免出现类型不一致的错误。
3.数组的遍历

        方法:for循环、for-each(增强for循环)、调用toString方法 。

package com.gty.algo.lesson;import java.util.Arrays;public class ArrayDemo1 {public static void main(String[] args) {int[] arr = {11, 9, 1, 2, 26, 12};/*数组的遍历*///1.for循环for (int i = 0; i < arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();//2.for-each(增强for循环)for (int x:arr) {System.out.print(x + " ");}System.out.println();//调用toString方法System.out.println(Arrays.toString(arr));}
}

 二.封装数组

        基于java提供给我们的数组,进行二次封装,我们可以自己去写一个我们自己的数组(动态数组)去实现数组的各种基本功能。

1.封装数组

主要功能:

        添加元素,获取元素,查看当前数组中元素的个数,获取容积,修改元素,数组扩容,判空,查询指定元素,删除指定位置的元素。

package com.gty.algo.lesson.array;// 支持泛型
public class MyArray<T> {private T[] arr;private int size;private int capacity; //容积// 构造方法public MyArray(int capacity) {// 入参判断if (capacity <= 0) {throw new IllegalArgumentException("输入容积异常!");}this.capacity = capacity;this.size = 0;this.arr = (T[]) new Object[this.capacity];}// 获取元素个数public int getSize() {return this.size;}// 获取容积public int getCapacity() {return this.capacity;}// 添加元素public void add(T item) {this.arr[this.size] = item;this.size++;}// 向指定位置添加元素public void addValueByIndex(int index, T value) {if (index < 0 || index > this.size) {throw new IllegalArgumentException("索引异常!");}if (this.size == this.capacity) {resize(this.capacity * 2);}for (int i = this.size - 1; i >= index; i--) {this.arr[i + 1] = this.arr[i];}this.arr[index] = value;this.size++;}// 扩容private void resize(int newCapacity) {T[] newArr = (T[]) new Object[newCapacity];for (int i = 0; i < this.size; i++) {newArr[i] = this.arr[i];}// 改变容器与容积this.arr = newArr;this.capacity = newCapacity;}// 判空public boolean isEmpty() {return this.size == 0;}// 修改元素public void modifyValueByIndex(int index, T value) {// 入参判断if (index < 0 || index > capacity) {throw new IllegalArgumentException("索引异常!");}this.arr[index] = value;}// 获取指定位置的值public T getValueByIndex(int index) {// 入参判断if (index < 0 || index > capacity) {throw new IllegalArgumentException("索引异常!");}return this.arr[index];}// 查询指定的值在数组中是否存在,存在返回索引,不存在返回-1public int containsValue(T value) {for (int i = 0; i < this.size; i++) {if (value.equals(this.arr[i])) {return i;}}return -1;}// 删除指定位置的元素public T deleteValueByIndex(int index) {// 入参判断if (index < 0 || index > capacity) {throw new IllegalArgumentException("索引异常");}// 1.找到删除的位置的元素T deValue = this.arr[index];// 2.将删除元素之后的元素前移for (int j = index + 1; j < this.size; j++) {this.arr[j - 1] = this.arr[j];}this.size--;// 判断是否缩容if (this.size <= this.capacity / 4 && this.capacity / 2 > 0) {resize(this.capacity / 2);}return deValue;}// 重写toString方法,用于数组打印@Overridepublic String toString() {StringBuilder sb = new StringBuilder();sb.append("{");for (int i = 0; i < this.size; i++) {sb.append(this.arr[i]);if (i < this.size - 1) {sb.append(",");}}sb.append("}");return sb.toString();}}
 2.例题介绍

        两数之和(1. 两数之和 - 力扣(LeetCode))

  •  题解:可以利用Map,将数组中的值和其对应的索引以键值对的方式存放在Map中。遍历数组,当发现target - nums[i](这是解决本题的重点思想,将两数之和转换为两数之差(值1 - 值2 = 目标值 即为,目标值 - 值1 = 值2))在Map中,说明找到了目标值,返回target - nums[i]的下标和i即可。基于以上思想,在向Map中存放键值对时,可以将数组中元素的值作为键,元素在数组中的索引作为值存放在Map中,方便我们获取索引。
  • 代码实现
package com.gty.algo.subject;import java.util.Arrays;
import java.util.HashMap;public class LeetCode_01 {public int[] twoSum(int[] nums, int target) {// 入参判断if(nums == null || nums.length < 2){return null;}// 利用Map,将数组中的值和其对应的索引以键值对的方式存放起来,可以将值作为Map中的键,索引作为值,HashMap<Integer, Integer> map = new HashMap<>();// 遍历数组,求数组中两数之和等于目标值,即求目标值 - 值1 = 值2,for (int i = 0; i < nums.length; i++) {int temp = target - nums[i];if(map.containsKey(temp)){ //判断值是否存在return new int[]{map.get(temp),i}; //map.get(temp)---通过key获取key对应的value}else{map.put(nums[i],i); //向Map中添加元素}}return null;}public static void main(String[] args) {int [] nums = {2,7,11,15};LeetCode_01 leetCode_01 = new LeetCode_01();int [] res = leetCode_01.twoSum(nums,9);System.out.println(Arrays.toString(res)); //[0, 1]}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/245307.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ZK高可用架构涉及常用功能整理

ZK高可用架构涉及常用功能整理 1. zk的高可用系统架构和相关组件1.1 Quorum机制1.2 ZAB协议 2. zk的核心参数2.1 常规配置2.2 特殊优化配置 3. zk常用命令3.1 常用基础命令3.2 常用运维命令 4. 事务性4.1 数据写流程4.2 数据读流程 5. 疑问和思考5.1 zk不擅长处理哪些场景&…

书生·浦语大模型实战营-学习笔记6

目录 OpenCompass大模型测评1. 关于评测1.1 为什么要评测&#xff1f;1.2 需要评测什么&#xff1f;1.3 如何评测&#xff1f;1.3.1 客观评测1.3.2 主观评测1.3.3 提示词工程评测 2. 介绍OpenCompass工具3. 实战演示 OpenCompass大模型测评 1. 关于评测 1.1 为什么要评测&#…

仿真机器人-深度学习CV和激光雷达感知(项目2)day5【作业1与答案1】

文章目录 前言作业1答案1 前言 &#x1f4ab;你好&#xff0c;我是辰chen&#xff0c;本文旨在准备考研复试或就业 &#x1f4ab;本文内容是我为复试准备的第二个项目 &#x1f4ab;欢迎大家的关注&#xff0c;我的博客主要关注于考研408以及AIoT的内容 &#x1f31f; 预置知识…

软件游戏提示msvcp140.dll丢失的解决方法,全面分析msvcp140.dll文件

msvcp140.dll是Microsoft Visual C 2015 Redistributable的一部分&#xff0c;它包含了许多用于运行程序的函数和类库。当这个文件丢失或损坏时&#xff0c;依赖于该组件的应用程序可能无法正常启动&#xff0c;系统会弹出错误提示&#xff0c;告知用户找不到msvcp140.dll文件。…

大语言模型推理提速:TensorRT-LLM 高性能推理实践

作者&#xff1a;顾静 TensorRT-LLM 如何提升 LLM 模型推理效率 大型语言模型&#xff08;Large language models,LLM&#xff09;是基于大量数据进行预训练的超大型深度学习模型。底层转换器是一组神经网络&#xff0c;这些神经网络由具有 self-attention 的编码器和解码器组…

网安培训第一期——sql注入+文件

文章目录 sql inject报错注入time盲注联合查询万能密码拦截和过滤ascii注入流程base64查询的列名为mysql保留关键字key 文件上传ffuf脚本要做的三件事网络端口进程用户权限文件文件包含文件下载XSS跨站请求攻击csrf跨站请求伪造 sql inject 判断输入字段是字符串还是数字 方法…

Linux/Doctor

Enumeration nmap 已知目标开放了22,80,8089端口&#xff0c;扫描详细情况如下 可以看到对外开放了22,80,8089三个端口 TCP/80 SSTI 访问80端口&#xff0c;有一个infodoctors.htb的电子邮件&#xff0c;点击其他的也没有什么反应&#xff0c;猜测有可能需要域名访问 在/et…

python_ACM模式《剑指offer刷题》链表1

题目&#xff1a; 面试tips&#xff1a; 询问面试官是否可以改变链表结构 思路&#xff1a; 1. 翻转链表&#xff0c;再遍历链表打印。 2. 想要实现先遍历后输出&#xff0c;即先进后出&#xff0c;因此可借助栈结构。 3. 可用隐式的栈结构&#xff0c;递归来实现。 代码…

不就业,纯兴趣,应该自学C#还是JAVA?

不就业&#xff0c;纯兴趣&#xff0c;应该自学C#还是JAVA? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「JAVA的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff…

docker-compose搭建redis集群

这里用docker-compose在一台机器搭建三主三从&#xff0c;生产环境肯定是在多台机器搭建&#xff0c;否则一旦这台宿主机挂了&#xff0c;redis集群全挂了&#xff0c;依然是单点故障。同时&#xff0c;受机器性能极限影响&#xff0c;其并发也上不去&#xff0c;算不上高并发。…

《WebKit 技术内幕》学习之十一(2):多媒体

2 视频 2.1 HTML5视频 在HTML5规范定义中&#xff0c;Web开发者可以使用“video”元素来播放视频资源。视频中有个重要的问题就是视频编码格式&#xff0c;对此&#xff0c;目前标准中包含了三种编码格式&#xff0c;它们分别是Ogg、MPEG4和WebM。其中Ogg是由Xiph.org组织开…

字符串匹配(BF KMP)详解 + 刷题

目录 &#x1f33c;前言 BF 算法 KMP 算法 &#xff08;1&#xff09;前缀函数 -- O(n^3) &#xff08;2&#xff09;前缀函数 -- O(n^2) &#xff08;3&#xff09;前缀函数 -- O(n) &#xff08;4&#xff09;辅助理解 &#x1f40b;P1308 -- 统计单词数 …

Linux:使用for+find查找文件并cp到其他目录,文件名带有空格

一、场景描述 在终端窗口中&#xff0c;用shell命令&#xff0c;批量拷贝文件到指定目录。 我是在Windows系统上&#xff0c;通过git bash终端来执行shell命令的。 二、实现过程 命令1 for filepath in find /d/LearningMaterials/数学/数学/高中/一数/偏基础&#xff08;基…

年销180万辆的特斯拉,护城河却在崩塌

文&#xff5c;刘俊宏 2023年率先开启汽车价格战的马斯克&#xff0c;伤敌一百自损八千&#xff1f; 在1月25日的特斯拉2023Q4财报电话会上&#xff0c;特斯拉CEO马斯克对中国公司的竞争力如此感叹道&#xff0c;“要是没有贸易壁垒&#xff0c;他们将摧毁&#xff08;destroy…

EXECL 单元格字符串链接 CONCAT :应用:将一行数据转为json

源&#xff1a; 目标 函数表示 CONCAT("data", CHAR(10), "{", CHAR(10), " ", "ulAlarmId : ", A5, CHAR(10), " ", "ulAlarmLevel : ", D5, CHAR(10)," ", "bBo…

《剑指 Offer》专项突破版 - 面试题 28 : 展平多级双向链表(C++ 实现)

题目连接&#xff1a;LCR 028. 扁平化多级双向链表 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 在一个多级双向链表中&#xff0c;节点除了有两个指针分别指向前后两个节点&#xff0c;还有一个指针指向它的子链表&#xff0c;并且子链表也是一个双向链表&…

怎么给wordpress网站底部页脚添加备案号和链接?

以前“WordPress后台 >> 常规”最底部是有一个ICP备案号的&#xff0c;我们只需要填写备案号并保存更改即可让WordPress自带主题底部显示ICP备案号&#xff0c;但是现在新版本的WordPress已经没有了这个ICP备案号选项&#xff0c;而且也无法直接添加公安联网备案号&#…

常见の算法

前言本文主要使用Java 什么&#xff0c;是快乐星球#&#xffe5;%……什么是算法&#xff1f; 算法是一组完成任务的指令。任何代码片段都可视为算法&#xff0c;但我们主要介绍常见算法 一、引入——二分查找 二分查找是一种算法&#xff0c;其输入是一个有序的元素列表。如…

web安全学习笔记【09】——算法2

基础[1] 入门-算法逆向&散列对称非对称&JS源码逆向&AES&DES&RSA&SHA #知识点&#xff1a; 1、Web常规-系统&中间件&数据库&源码等 2、Web其他-前后端&软件&Docker&分配站等 3、Web拓展-CDN&WAF&OSS&反向&负载…

socket以及字节序

1. socket 介绍&#xff1a; 简介&#xff1a; 所谓 socket&#xff08; 套接字&#xff09;&#xff0c;就是对网络中不同主机上的应用进程之间进行双向通信的 端点的抽象。 一个套接字就是网络上进程通信的一端&#xff0c;提供了应用层进程利用网络协议交换数据的机制。从所…