《2-数组》

news/2024/11/25 19:36:45/

数组

1.简介:

数组(Array)是一种固定长度的存储相同数据类型在连续内存空间中的数据结构

引出:[索引 (Index)]----元素在数组中的位置

2.初始化

写法:一般用到无初始值、给定初始值
在不给定初始值的情况下,通常所有元素会被初始化为默认值0

/*初始化数组*/
int[] arr=new int[5];//{0,0,0,0,0}
int[] nums={1,3,2,5,4}; 
 

3.优点:
在数组中访问元素非常高效
给定数组首个元素的地址和一个元素的索引,利用以下公式可以直接计算得到该元素的内存地址,从而直接访问此元素

公式:元素内存地址=数组内存地址+元素长度*元素索引(elementAddr=firtsElementAddr+elementLength*elementIndex)

4.缺点:

数组在初始化后长度不可变
由于系统无法保证数组之后的内存空间是可用的,因此数组长度无法扩展
而若希望扩容数组,则需新建一个数组,然后把原数组元素依次拷贝到新数组,在数组很大的情况下非常耗时

/*扩展数组长度*/
int[] extend(int[] nums,int enlarge){//初始化一个扩展长度后的数组int[] res=new int[nums.length+enlarge];//将原数组中的所有元素复制到新数组for(int i=0;i<nums.length;i++){res[i]=nums[i];} //返回扩展后的新数组return res; 
}
 

数组中插入或删除元素效率低下
如果我们想要在数组中间插入一个元素,由于数组元素在内存中是“紧挨着的”,它们之间没有空间再放任何数据

因此,我们不得不将此索引之后的所有元素都向后移动一位,然后再把元素赋值给该索引

/*在数组的索引 index处插入元素 num*/
void insert(int[] nums,int num,int index){//把索引 index以及之后的所有元素向后移动一位for(int i=nums.length-1;i>index;i--) nums[i]=nums[i-1];//将 num赋给 index处元素nums[index]=num; 
}
 

删除元素也是类似,如果我们想要删除索引i处的元素,则需要把索引i之后的元素都向前移动一位。
值得注意的是,删除元素后,原先末尾的元素变得“无意义”了,我们无需特意去修改它;

/*删除索引index处元素*/
void remove(int[] nums,int index){//把索引 index之后的所有元素向前移动一位for(int i=index;i<nums.length-1;i++) nums[i]=nums[i+1];
}
 

总结来看,数组的插入与删除操作有以下缺点:
●时间复杂度高:数组的插入和删除的平均时间复杂度均为O(N),其中N为数组长度
●丢失元素:由于数组的长度不可变,因此在插入元素后,超出数组长度范围的元素会被丢失
●内存浪费:我们一般会初始化一个比较长的数组,只用前面一部分,这样在插入数据时,丢失的末尾元素都是我们不关心的,但这样做同时也会造成内存空间的浪费

5.常用操作:

数组遍历

以下介绍两种常用的遍历方法:

/*数组遍历*/
void traverse(int[] nums){int cnt=0;//通过索引遍历数组for(int i=0;i<nums.length;i++) cnt++;//直接遍历数组for(int num:nums) cnt++;
} 
 

数组查找

通过遍历数组,查找数组中的指定元素,并输出对应索引

/*在数组中查找指定元素*/
void find(int[] nums,int target){for(int i=0;i<nums.length;i++)if(nums[i]==target) return i;return -1;
} 
 

6.典型应用:

随机访问;如果我们想要随机抽取一些样本, 那么可以用数组存储,并生成一个随机序列,根据索引实现样本的随机抽取

二分查找;例如查字典的例子,我们可以将字典中的所有字按照拼音顺序存储在数组中,然后使用与日常查纸质字典相同的“翻开中间,排除一半” 的方式,来实现一一个查电子字典的算法


//做笔记的美好的一天
 


http://www.ppmy.cn/news/276683.html

相关文章

拼多多笔试题(三):多多的电子字典

问题描述&#xff1a; 多多鸡打算造一本自己的电子字典&#xff0c;里面的所有单词都只由a和b组成。 每个单词的组成里a的数量不能超过N个且b的数量不能超过M个。 多多鸡的幸运数字是K&#xff0c;它打算把所有满足条件的单词里的字典序第K小的单词找出来&#xff0c;作为字典…

你觉得java与嵌入式学哪个好?

只要是现在选择嵌入式的学员&#xff0c;都是因为嵌入式未来发展好&#xff0c;薪资待遇好&#xff0c;那么java是不是也拥有这些特点呢&#xff1f;如果你还不了解这些的话&#xff0c;那么下面就要跟紧小编了&#xff0c;一起来了解下Java与嵌入式学哪个好吧。 点击获取1V1嵌…

嵌入式技术的前沿应用领域

嵌入式系统是以应用为中心&#xff0c;以计算机技术为基础&#xff0c;并且软硬件可剪裁&#xff0c;适用于应用系统对功能、可靠性、成本、体积和功耗有严格要求的专用计算机系统 嵌入式系统在当下生活中应用非常广泛&#xff0c;应用于电信系统、电子类产品、医疗设备、智能家…

什么叫嵌入式开发 嵌入式开发的要求

嵌入式开发就是指在嵌入式操作系统下进行开发&#xff0c;常用的系统有wince&#xff0c;ucos&#xff0c;vxworks&#xff0c;linux&#xff0c;android等。 另外&#xff0c;用c&#xff0c;c或汇编开发&#xff1b;用高级处理器&#xff0c;arm7&#xff0c;arm9&#xff0…

java电子小词典课程设计_Java英汉电子字典课程设计源代码.doc

用户需求分析&#xff1a; 英汉同典作为一个常用的学习工具&#xff0c;是我们经常要使用的。该系统能完成一个简 单的电子词的功能。该系统主要用于实现英汉互译的功能&#xff0c;系统拥有自己的数据 库。 英译汉功能&#xff1a;我们对以先选择让系统进行英译汉功能&#xf…

java电子字典

这段时间,在写个背单词的软件,就顺手写了个电子词典, 等完成了一起发布 初期找了好久字典库,发现网上没有公开的字典库,都是有版权的,而且还加密了,比如灵格斯的,都加密了, 最后选了用星际译王 早前用的牛津 词典库,也是要版权的,星际译王也侵权用了,也没办法了,反正写来自用…

网络编程重点

1> OIS 7层模型 TCP/IP 4层模型 5层模型 2> 传输层的功能 网络层的功能&#xff1f;以及分别是第几层 传输层&#xff1a;提供端到端的可靠传输&#xff0c;指定哪个进程哪个发送进程接收 第四层 网络层&#xff1a;寻址和路由选择 第三层 3>MAC地址&#xff1a; a. …

生活中常见的嵌入式产品都有哪些?

经常在说嵌入式已经融进我们的生活&#xff0c;可能还有些人不信&#xff0c;肯定觉得嵌入式开发并没有那么神奇&#xff0c;这样理解其实也很正常&#xff0c;要是对嵌入式没有了解&#xff0c;这些都是可能的&#xff0c;下面就一起来了解下生活中常见的嵌入式产品都有哪些吧…