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里面的不规则的二维数组的用法;

相关推荐
iknow18122 分钟前
【前端安全】js逆向之微信公众号登录密码
开发语言·前端·javascript
面包会有的,牛奶也会有的。1 小时前
python测试开发---前后端交互Axios
开发语言·前端·vue.js·交互
高高要努力1 小时前
SpringBoot-全局处理异常,时间格式,跨域,拦截器,监听器
java·spring boot·spring
爱数学的程序猿1 小时前
【C++篇】启航——初识C++(下篇)
开发语言·c++
Code豪客1 小时前
Java常用三类定时器快速入手指南
java·开发语言·后端·spring
白子寰1 小时前
【C++打怪之路Lv4】-- 类和对象(中)
开发语言·c++
阿乾之铭1 小时前
Lombok 在 IntelliJ IDEA 中的使用步骤
java·ide·intellij-idea
printf_8241 小时前
Android 长按文本弹出输入框
android·java·开发语言
李少兄1 小时前
使用 IntelliJ IDEA 连接到达梦数据库(DM)
java·数据库·intellij-idea
_.Switch2 小时前
边缘计算与 Python Web 应用:从理论到实践
开发语言·前端·人工智能·python·架构·log4j·边缘计算