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

本期我们来到数组模块,今天先夯实好基础

1.查找一个元素
2.增加一个元素
3.删除一个元素

一、查找一个元素

很多题目本质就是查找问题,而数组是查找的最佳载体。

来,上代码~

/**
* @param size 已经存放的元素个数
* @param key  待查找的元素
  */
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;
}

这段代码很简单,没有需要特别注意的点,记住就行。

二、增加一个元素

增加和删除元素是数组最基本的操作,看别人的代码非常容易,但是自己写的时候经常bug满天飞。

看了算法知识库的原代码后,我又自己敲了一遍。方便给大家阅读,我就上原代码吧~

/**
     * @param arr
     * @param size    数组已经存储的元素数量,从1开始编号
     * @param element 待插入的元素
     * @return
     */
public static int addByElementSequence(int[] arr, int size, int element) {
    //问题①:是否应该是size>arr.length
    if (size >= arr.length)
        retrun -1;

    //问题②想想这里是否是index=0或者size-1?
    int index = size;
    //找到新元素的插入位置,问题③ 这里是否应该是size-1?
    for (int i = 0; i < size; i++) {
        if (element < arr[i]) {
            index = i;
            break;
        }
    }
    //元素后移,问题④想想这里为什么不是size-1
    for (int j = size; j > index; j--) {
        arr[j] = arr[j - 1]; //index下标开始的元素后移一个位置
    }
    arr[index] = element;//插入数据
    return index;
}

代码注释中有 4 个问题,大家自己在编写代码时需要好好思考,可能一个不慎,bug就层出不穷。

下面这 4 个问题我一一来解答。

问题①:是否应该是size>arr.length?

条件就是 size >= arr.length 而不是 size > arr.length。这是因为 size 表示已经存储的元素数量,从1开始编号,当 size 等于 arr.length 时,数组已经满了,不能再插入新元素。

问题②:想想这里是否是index=0或者size-1?

这里 index 的初始值应该是 size,因为你要在已有元素的序列中找到新元素的插入位置,新元素应该插入到已有元素之后。所以 index 的初始值应该是 size 而不是 0 或 size - 1

问题③ :找到新元素的插入位置,这里是否应该是size-1?

在找到新元素的插入位置时,这里不需要是 size - 1,因为你要找的位置是在已有元素序列中,而不是在整个数组中。所以只需要遍历到 size - 1

问题④:元素后移,想想这里为什么不是size-1

元素是整体往后移动,原本最后一个元素的下标是size-1,往后移一位就是size了,所以这里 j 刚开始的值时size,也就是最后一个元素移动后的下标。

三、删除一个元素

对于删除,不能一边从后向前移动一边查找了,因为元素可能不存在。
所以要分为两个步骤,先从最左侧开始查是否存在元素,如果元素存在,则从该位置开始执行删除操作。

上代码~

/**
 * 从数组中删除元素 key
 * @param arr 数组
 * @param size 数组中的元素个数,从1开始
 * @param key 删除的目标值
 * @return 返回删除元素后的新数组大小
 */
public int removeByElement(int[] arr, int size, int key) {
    // 初始化索引为 -1,表示未找到要删除的元素
    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;
}

理解了增加一个元素之后,删除一个元素也不会太难,重要的是自己要动手写一遍才知道自己有没有问题。

以上三个都是数组的基本操作,要熟记~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值