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