一、数组转为字符串

要用到与数组相关的工具类 Arrays(特别的,一般工具类都是以s结尾,例如集合框架的工具类Collections,线程池的工具类Executors)

若不转为字符串直接输出数组的话,仅仅只会输出该数组的地址(加密后的地址,实际地址取不到)

用数组解决众数问题java_用数组解决众数问题java

 下面输出的内容为  [ i@1b6d3586   其中  [ 表示引用类型是一个数组,i 表示是一个整型数组, @后是加密地址

而想要直接输出整个数组内容,最常见就是直接转为字符串。

用数组解决众数问题java_用数组解决众数问题java_02

 使用Arrays.toString(数组名称);即可

该toString方法可以使用for循环复刻,我们创建arr2Str方法来实现Arrays.toString 如下图

用数组解决众数问题java_数据结构_03

 二、数组拷贝问题

使用的方法为Arrays.copyOf(原数组名称,新数组长度)

特别的,拷贝的数据变更不会对原数组中的数据造成影响

使用时会出现三种状况

1 新数组长度等于原数组长度,为全拷贝

用数组解决众数问题java_数组_04

2 新数组长度大于原数组长度,那么原数组元素全部拷贝完后,超过的部分用数据类型的默认值填充。

3 新数组长度小于原数组长度,默认从第一个数据开始拷贝,拷贝到新数组的长度为止。

4 数组的部分拷贝调用copyOfRange方法:

copyOfRange(原数组名称,起始位置索引,终止位置索引)【起止位置与终止位置为左闭右开区间】注意这个起始位置和终止位置为数组元素的编号哦。

用数组解决众数问题java_数组长度_05

 5 创建arrCopy方法用for循环实现自己数组的全拷贝

用数组解决众数问题java_数组长度_06

 第二行先初始化一个数组长度和输入数组num长度相同的数组ret,然后使用for循环依次将num各个编号指向的数据赋给ret,最后返回ret。

三、求整型数组的平均值

用数组解决众数问题java_数组_07

 该方法可以用递归做,base case为 数组内只剩下一个元素时,返回该元素的值,因为一个元素的和就是它自己。

四、检索:在 数组中查找指定数值的元素,若存在,返回该元素对应的下标(若存在多个,默认返回第一个的下标)不存在返回-1,因为不可能有元素下标为-1.

用数组解决众数问题java_数组_08

 上图中检索7会出结果3,而检索10会返回-1.

五、基于数组检索的问题,我们发现,逐个检索效率太低,因此我们引入有序数组的二分检索

有序数组:

升序:前一个一定小于后一个,以此类推

降序:前一个一定大于后一个,以此类推

有序数组的二分检索:将需要检索的数据与数组中最中间的那个元素进行比较大小,然后舍弃另一半不需要的数据,再在留下的数据内与最中间的元素进行比较,以此类推,直到被检索的数据与被比较的元素数据相等为止,此时检索到该数据了,如果直到只剩最后一个数据也不相等,则返回-1表示该数组中不存在该数据。

二分查找要注意的点:

1 在不断的进行二分的时候,划分剩下的一半的左边界要是大于了右边界,该区域就没有数据存在了

2 不断进行二分的时候,划分的剩下的一半的左边界等于右边界时,该区域内只有一个元素。因此在写代码时特别注意循环退出的限定条件,不能在边界相等时退出,因为会漏掉一个元素没有进行检索。

六、那么如何更方便地对无序数列进行检索呢?当然是先把无序转为有序再用有序数列地检索方法来检索

七大排序方法,这里只介绍一下冒泡排序

冒泡排序:指的是对一个数组内所有的元素数值进行两两比较,从编号为0的到编号为n-1的依次进行两两比较,如果其中一个数字较大,那么放到右边,否则放在左边,然后再将较大的那个数字和下一位进行比较,以此类推,第一轮比较完后最大的数就会放在n-1的位置上,然后再进行第二轮两两比较,不同的是此时不需要再和n-1位的进行比较,因为他是刚刚比较区间内最大的数字。

通过下图

用数组解决众数问题java_数组_09

 我们可以发现,对含有N个元素的数组执行N次冒泡排序后,所有的元素都被排序过了,也就是说所有的元素都进入了有序空间,排序完成。

有两点要注意的地方(可以优化的地方)

第一点是,我们每执行一次,两两交换比较的次数就可以少一次,没有必要再让未排序空间的数字与已排序空间的数字进行比较了,未排序空间最大的已经放在了编号靠后的位置上了。

第二点是,如果我们在执行某一次冒泡排序时发现一次都没有执行位置的交换,那么就证明整个数组已经有序,则不需要继续执行排序,可以直接退出程序。