# 第 05 章:随堂复习与企业真题(数组)


# 一、随堂复习

# 1. 数组的概述

  • 数组,就可以理解为多个数据的组合。
  • 是程序中的容器:数组、集合框架(第 12 章,List、Set、Map)
  • 数组存储的数据的特点:依次紧密排列的、有序的、可以重复的
  • 此时的数组、集合框架都是在内存中对多个数据的存储。
  • 数组的其它特点:一旦初始化,其长度就是确定的、不可更改的

# 2. 一维数组的使用(重要)

> 数组的声明和初始化
	int[] arr = new int[10];
	String[] arr1 = new String[]{"Tom","Jerry"};
> 调用数组的指定元素:使用角标、索引、index
	>index从0开始!
> 数组的属性:length,表示数组的长度
> 数组的遍历
> 数组元素的默认初始化值
> 一维数组的内存解析(难)
	前提:在main()中声明变量:int[] arr = new int[]{1,2,3};
	> 虚拟机栈:main()作为一个栈帧,压入栈空间中。在main()栈帧中,存储着arr变量。arr记录着数组实体的首地址值。
	> 堆:数组实体存储在堆空间中。

# 3. 二维数组的使用(难点)

  • 二维数组:一维数组的元素,又是一个唯一数组,则构成了二维数组。
> 数组的声明和初始化
> 调用数组的指定元素
> 数组的属性:length,表示数组的长度
> 数组的遍历
> 数组元素的默认初始化值
> 二维数组的内存解析(难)

# 4. 数组的常用算法(重要)

  • 数值型数组的特征值的计算:最大值、最小值、总和、平均值等
  • 数组元素的赋值。比如:杨辉三角;彩票随机生成数(6 位;1-30;不能重复);回形数
  • 数组的复制、赋值
  • 数组的反转
  • 数组的扩容、缩容
  • 数组的查找
    • 线性查找
    • 二分法查找(前提:数组有序)
  • 数组的排序
    • 冒泡排序:最简单
    • 快速排序:最常用

# 5. Arrays 工具类的使用

  • 熟悉一下内部的常用的方法
    • toString() / sort() / binarySearch()

# 6. 数组中的常见异常

  • ArrayIndexOutOfBoundsException
  • NullPointerException

# 二、企业真题

# 1. 数组有没有 length () 这个方法?String 有没有 length () 这个方法?(* 蓝)

数组没有 length (),是 length 属性。

arr.length

String 有 length ()。

str.length()

# 2. 有数组 int [] arr,用 Java 代码将数组元素顺序颠倒(闪 * 购)

# 3. 为什么数组要从 0 开始编号,而不是 1 (中 * 支付)

数组的索引,表示了数组元素距离首地址的偏离量。因为第 1 个元素的地址与首地址相同,所以偏移量就是 0。所以从 0 开始。

# 4. 数组有什么排序的方式,手写一下(平 * 保险)

冒泡。

快排。(讲完递归方法以后,大家就可以练习一下)

# 5. 常见排序算法,说下快排过程,时间复杂度?(5 * 到家)

见课件。

快排:O(nlogn)O(nlogn)

# 6. 二分算法实现数组的查找(神舟 * 天软件)

# 7. 怎么求数组的最大子序列和(携 *)

public class excise9_max_subArray {
    public static void main(String[] args) {
        /*
         * 输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
         * 求所有子数组的和的最大值。要求时间复杂度为 O (n)。
         例如:输入的数组为 1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为 3, 10, -4, 7, 2,
         因此输出为该子数组的和 18。*/
        int[] arr = {1, -2, 3, 10, -4, 7, 2, -5};
        int res = Integer.MIN_VALUE;
        int tmpSum = 0; // 记录当前子数组的和
        for (int i = 0; i < arr.length; i++) {
            tmpSum += arr[i];
            if (tmpSum > res) {
                res = tmpSum; // 更新最大值
            }
            if (tmpSum < 0) {
                tmpSum = 0; // 如果当前子数组的和小于 0,就抛弃
            }
        }
        System.out.println(res);
    }
}

# 8. Arrays 类的排序方法是什么?如何实现排序的?(阿 *、阿 * 校招)

快速排序。