算法通关村——不简单的数组增删改查

1 创建和初始化数组

在 Java 中可以通过如下方式创建数组:

 int[] arr = new int[5];

该代码创建了一个长度为 5 的数组。

在 Java 中可以通过如下方式来初始化数组:

int[] arr = new int[]{0, 1, 2, 3, 4};

该方式也可以写成:

int[] arr = {0, 1, 2, 3, 4};

还可以通过循环赋值的方式来初始化数组:

int[] arr = new int[5];
for (int i = 0; i < arr.length; i++) {
     arr[i] = i;
}

2 查找数组中的元素

查找数组中的元素可以通过线性查找的方式,从头遍历数组逐一比对数组中当前位置的元素是否为待查找的元素,如果是,则返回当前元素所在的位置,如果不是,则返回 -1。

Java 代码实现如下:

/**
 * @param arr  数组
 * @param size 数组已存储元素个数,从 1 开始编号
 * @param key  待查找的元素
 * @return 如果查找到则返回元素所在位置,未查找到则返回 -1
 */
public static int findByElement(int[] arr, int size, int key) {
    for (int i = 0; i < size; i++) {
        if (arr[i] == key)
            return i;
    }
    return -1;
}

3 在数组中插入元素

在数组中插入元素,可以先找到元素在数组中要插入的位置,然后再将该位置后的元素依次往后挪,最后将要插入的元素插入到相应的位置上。

以在升序数组中插入元素为例,Java 代码实现如下:

/**
 * 在数组中添加元素
 *
 * @param arr     数组
 * @param size    数组已存储元素个数,从 1 开始编号
 * @param element 待插入的元素
 * @return 返回元素插入的位置,插入失败返回 -1
 */
 public static int addElement(int[] arr, int size, int element) {
     if (size >= arr.length) {
         return -1;
     }

     int index = size;
     for (int i = 0; i < size; i++) {
         if (element < arr[i]) {
             index = i;
             break;
         }
     }

     for (int j = size; j > index; j--) {
         arr[j] = arr[j - 1];
     }
     arr[index] = element;

     return index;
 }

问题 1:为什么代码中 size >= arr.length 而不是 size > arr.length ?
答:因为 size 为数组已存储元素个数,从 1 开始,而 arr.length 也是从 1 开始的,加上数组中存放元素的位置是从 0 到 arr.length - 1 的,所以当 size = arr.length 时也是不能存放元素的,因此,当 size >= arr.length 时就不能再插入元素了。

问题 2:为什么让 index = size ?
答:size 为数组已存储元素个数,而执行到该语句时说明满足 size < arr.length,我们这里让 index = size 的意思是先默认元素插入到尾部位置,后续在循环中再判断是否需要重新调整元素插入的位置。因为这里是在升序数组中插入元素,所以在循环中判断插入位置的条件是 element < arr[i] ,也就是说如果存在 arr[i] 大于 element ,那么 element 应该插入到 arr[i] 的位置上。

问题 3:为什么让 j = size ?
答:j = size 的意思是从尾部的元素开始,将 index 后的元素依次向后挪。

4 在数组中删除元素

在数组中删除元素可能会出现要删除元素不存在的情况,所以需要先判断删除的元素是否存在,如果存在再进行删除。删除数组中的元素只需将要删除元素后面位置的元素依次往前挪。

Java 代码实现如下:

/**
 * 从数组中删除元素 key
 *
 * @param arr  数组
 * @param size 数组已存储元素个数,从 1 开始编号
 * @param key  删除的目标值
 * @return 返回数组已存储元素个数
 */
public int removeElement(int[] arr, int size, int key) {
    int index = -1;

    for (int i = 0; i < size; i++) {
        if (arr[i] == key) {
            index = i;
            break;
        }
    }

    if (index != -1) {
        for (int i = index + 1; i < size; i++) {
            arr[i - 1] = arr[i];
        }
        size--;
    }

    return size;
}

代码中用 index 来标记要删除元素的位置,index = -1 时表示要删除的元素不存在,当在后面的循环中查找到了要删除元素时 index 的值将被更新为要删除元素所在的位置,这时说明要删除的元素存在, index != -1 ,随后需要将 index 后面的元素依次往前挪,最后让 size 减 1,完成数组中元素的删除,返回当前数组已存储元素个数。

5 总结

本文使用 Java 完成了数组的创建和初始化,并编码实现了在数组中插入、删除、查找元素。数组插入和删除元素时需要注意边界问题。

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值