Java数组使用&练习(完)

目录

1.数组的使用

1.1数组拷贝native

1.2二分查找

1.3数组元素的平均值

1.4数组元素的排序

1.5其他的常用的方法

1.6冒泡排序实现

1.7数组元素的逆置实现

1.8二维数组

2.关于数组的课后练习

2.1改变数组原有的元素的值

2.2奇数在前,偶数在后

2.3判断目标是哪两个数字求和

2.4单身狗

2.5多数元素

2.6三个连续奇数的数组

3.不规则二维数组


1.数组的使用

1.1数组拷贝native

这个方法如果是被native所修饰,这个就是底层使用的C/C++实现的,这个优点就是速度很快;

我们的copyOf和copyofRange这个函数底层使用的都是这个函数;

我们的这个函数也是可以实现这个拷贝的,使用的就是这个 arraycopy这个函数,使用system进行调用的,这个里面的参数其实很好理解,从arra数组的0位置开始拷贝,拷贝到这个temp的0位置,这个拷贝的元素的个数就是我们的arr.length长度;

这个提示代码里面也写了这个srcPos意思就是源头的开始的位置,destPos就是我们的目的地的位置下标,这个灰色的是我们的这个系统提示出来的,我们不需要写的,他自己会自动补充出来;

1.2二分查找

前提就是这个数组里面的这个元素是有序地,因此这个参数就是我们的数组和我们的查找的元素,pos接受的就是我们想要查找的元素,因为这个4是存在的,因此这个打印的结果就是3下标;

下面的这个Arrays里面的这个binaryResearch这个方法就是原生的查找的方法,也是可以实现这个二分查找的效果的;

这个如果不存在,我们自定义实现的是返回-1,而这个原生的函数返回的是-(length+1)这个值,也是一个负数;

1.3数组元素的平均值

通过遍历这个数组求解我们的数组元素的和,然后除以这个数组元素的个数就是我们的这个数组的和的平均值;

1.4数组元素的排序

我们可以调用这个arrays这个类里面的sort函数对于这个无顺序的数组进行排序;

1.5其他的常用的方法

Arrays里面为我们提供了很多的方法,其中的这个equals用来进行判断我们的这个两个数组是不是完全一样的;

fill表示对于这个数组里面的元素进行填充,我们的下面的这个案例的就是3-5这个下标,左闭右开区间,填充的数值是-1这个元素;

1.6冒泡排序实现

这个冒泡排序也是使用两个循环进行控制,进行这个数据的交换,主要是使用的这个arrays.tostring这个方法进行数组元素的打印;

1.7数组元素的逆置实现

定义一个left和right,让两个指针一个向前移动,一个向后移动,让对应位置的元素进行交换;

1.8二维数组

第一种就是两层循环的方式,这个二维数组可以理解为两个一维数组,我们的这个外层循环就是求解的一维数组的个数,第二层循环求解的是每一个一维数组元素的个数;

第二个调用的是我们的这个Arrays对象里面的一个方法,实现对于这个二维数组的打印;

第三种打印的方式:使用的就是我们的这个for类似的东西,这个第一次就是接受我们的一维数组的,

2.关于数组的课后练习

2.1改变数组原有的元素的值

上面的这个题目其实有两个方法解决,一个就是在原来的这个数组上面进行操作,还有一个就是开辟一个新的数组,然后对于这个新的数组进行操作,这个时候我们的数组的初始版本是不变的,我们在这个数组上面直接操作的话就会改变这个数组;

第一个func1就是直接在原来的数组上面进行操作;

第二个func2就是开辟相同空间大小数组temp,我们把原来的数组扩大2倍之后的这个数值存储到我们的这个temp数组对应的这个下标位置;

2.2奇数在前,偶数在后

我们可以通过一个left和一个right控制这个过程,因为这个题目要求我们的奇数在前面,因此这个时候我们判断对于这个数值%2之后的余数,如果不是0证明这个数字就是奇数,我们直接让这个left+=就可以了,因为我们的奇数本来就是在前面的,同理对于这个right进行控制,然后如果两个条件都没有满足,这个时候我们就会使用这个swap对于这个数据进行交换;

我们细心就会发现这个内层的while循环里面,还有一个这个left<right的判断,这个外面不是已经有了吗,为什么里面还要写,我们可以尝试只写arr[left]%2==0这个式子,这个时候我们会发现,奇数在前,偶数在后的这个效果是无法实现的,这个是因为我们的最外层的left<right主要就是控制这个循环的,刚开始这个最外层的循环是一定满足的,但是这个如果里面不写这个left<right,我们如果遇到全部都是奇数的情况,这个left就会一直++下去,无法停止,这个显然是不可以的;

2.3判断目标是哪两个数字求和

针对于这个问题,我们就是使用这个i,j对于这个数组里面的元素进行控制;

我们的做法就是:让i指向第一个元素,j指向第二个元素,这个时候i不变,我们让这个j不断地向后++,直到我们的这个i,j下标对应的这个数值相加求和之后为我们的target再停止这个过程;

如果还是不行,我们让这个i指向第二个位置的元素,让这个j指向第三个位置的元素,j从第三个位置开始向后,依次进行求和,我们会发现这个过程中,初始情况下这个i+1等于j,因此这个也是我们的循环初始时刻的这个情况,因为我们的最后一个肯定是j,所以我们的这个终止条件在写的时候,是i<arr.length-1,而这个j<arr.length,因为我们的这个i不可能指向最后一个元素,但是这个j是可以指向最后一个元素的;

我们在这个func函数里面对于这个temp初始化的时候是全部初始化为-1,这个主要是因为我们的temp作为返回值,如果我们最后找到了,可以把找到的两个元素的下标复制到这个temp里面,如果没有找到,这个时候我们的两个-1虽然被返回了,但是这个下标不可能是-1,因此这个是提示我们目标求和之后为targer的两个数字没有找到;

2.4单身狗

这个就是设置一个初始值,然后不断的进行异或操作;

下面的这个就是让我们的这个ret依次和这个数组里面的每一个元素进行异或,剩下的这个数字保留在了我们的这个ret变量里面,这个时候我们的ret就是这个只出现一次的数字;

2.5多数元素

出现次数大于n/2次的元素:叫做多数元素;

这个看似好像需要我们进行统计,实际上这个只要我们使用sort进行排序之后,这个里面的中间的元素就是出现多数的元素,不信下去可以试试;

因此我们的这个方法里面先是对于传递进来的这个数组进行sort,然后把这个排序之后数组的之间位置返回就可以了;

2.6三个连续奇数的数组

因为统计的是出现三次的数字,因此我们需要定义一个count,连续出现一次就加上1,如果中间遇到了偶数,这个时候就count置为0,每一次对于这个count++的时候都需要判断我们的count是不是等于3,等于3就需要返回true,证明这个数组里面是有三个连续的奇数的;

3.不规则二维数组

我们上次说了这个java里面的二维数组的打印方法,以及这个二维数组里面的理解,是多个一维数组组成的;

我们的第一行是定义一个两行的数组,第一行的数组有三列,第二行的数组有3列,上面的就是这个不规则数组的图解,方便我们理解,这个就是java里面的不规则的二维数组的用法;

相关推荐
HaiFan.13 分钟前
SpringBoot 事务
java·数据库·spring boot·sql·mysql
我要学编程(ಥ_ಥ)21 分钟前
一文详解“二叉树中的深搜“在算法中的应用
java·数据结构·算法·leetcode·深度优先
music0ant24 分钟前
Idea 添加tomcat 并发布到tomcat
java·tomcat·intellij-idea
一个没有本领的人28 分钟前
win11+matlab2021a配置C-COT
c语言·开发语言·matlab·目标跟踪
一只自律的鸡1 小时前
C项目 天天酷跑(下篇)
c语言·开发语言
计算机徐师兄1 小时前
Java基于SSM框架的无中介租房系统小程序【附源码、文档】
java·微信小程序·小程序·无中介租房系统小程序·java无中介租房系统小程序·无中介租房微信小程序
源码哥_博纳软云1 小时前
JAVA智慧养老养老护理帮忙代办陪诊陪护小程序APP源码
java·开发语言·微信小程序·小程序·微信公众平台
沐泽Mu1 小时前
嵌入式学习-QT-Day05
开发语言·c++·qt·学习
小板凳-BGM1 小时前
C# 第二阶段 modbus
开发语言·ui·c#
问道飞鱼1 小时前
【Python知识】Python进阶-什么是装饰器?
开发语言·python·装饰器