【蓝桥杯赛前准备】【数据结构】数组的增删改查

好的又是我我来了,本菜狗有为csdn添加一烂博客了
今天依旧是为蓝桥杯落泪的一天,朋友们你们有信心嘛,反正我没有
依然是:本文运行环境:JAVA
本文使用编辑器:IDEA

怎么在数组中增加元素?

  • 我们先从最简单的一种方法说起:从末尾插入
    在这里插入图片描述那这样写个对应的方法也不是很难
public void addLast(int e){
        //传入相应的元素
        //add(size,e);
        data[size]=e;
        size++;
    }
  • 单单从数组后面加入元素是不够我们使用的,我们还需要在中间插入元素
    假设我们要在索引为1的位置插入一个数据,要怎么做呢
    在这里插入图片描述
    • 第一步,讲要插入这个元素位置以及后面的元素都向后挪
      在这里插入图片描述
    • 第二步,插入待插入的数据
    • 第三步,维护数组(即size++)
      在这里插入图片描述
      综上所述我们可以去写一个方法
public void add(int index,int e){
//当数据溢出的适合
        if(size==data.length){
            throw new IllegalArgumentException("ADDLAST FAUILED");
        }
        //不是紧密联系的
        if(index<0 || index>size){
            throw new IllegalArgumentException("ADDLAST FAUILED");
        }
        for(int i=size-1;i>=index;i--){
            data[i+1]=data[i];
        }
        data[index]=e;
        size++;
    }

这样的方法是否和我们之前的方式有所重合呢,显然是有的,虽然向后插入和中间插入省去了挪的步骤,但其他的步骤是重合的。
我们就可以根据这个重复的步骤进行代码复用

public void addLast(int e){
        //传入相应的元素
        add(size,e);
        //data[size]=e;
        //size++;
    }

    public void addFirst(int e){
        add(0,e);
    }

这里可以看到,不管是头插还是尾插,都可以使用这样的代码,头插就是当index=0的时候,所有的元素向后挪。而尾插则跳过了循环条件检查,直接进入赋值和维护数组的步骤。这么一看数组的增加数字,是不是很简单。

  • 测试

    我这边重写了toString方法,这里不涉及本课内容所以不做过多演示。

package com.company;

public class Main {

    public static void main(String[] args) {
        // write your code here
        Array arr = new Array(20);
        for (int i = 0; i < 10; i++) {
            arr.addLast(i);
        }
        System.out.println(arr);
        arr.add(1, 100);
        System.out.println(arr);

        arr.addFirst(-1);
        System.out.println(arr);
    }
}

打印结果:
在这里插入图片描述

那获取元素和修改元素不是一样的道理吗?

根据下标找到对应的元素,插入待修改的数据/找到该元素

//获取index索引位置的元素
    int get(int index){
        if(index<0 || index>size){
            throw new IllegalArgumentException("ADDLAST FAUILED");
        }
        return data[index];
    }
    //获取index索引位置的元素,直接插入,不用挪位置
    void set(int index,int e){
        if(index<0 || index>size){
            throw new IllegalArgumentException("ADDLAST FAUILED");
        }
        data[index] = e;
    }
  • 测试
package com.company;

public class Main {

    public static void main(String[] args) {
        // write your code here
        Array arr = new Array(20);
        for (int i = 0; i < 10; i++) {
            arr.addLast(i);
        }
        //System.out.println(arr);
        arr.add(1, 100);
        //System.out.println(arr);

        arr.addFirst(-1);
        //System.out.println(arr);

        System.out.println( arr.get(1));
        arr.set(10,1000000);
        System.out.println(arr);
    }
}
  • 测试结果
    在这里插入图片描述

查找以及包含

写两个方法,一个负责查找数组中是否有元素,一个查找如果有这个元素则返回下标
两个方法的内核是一样的,只不过一个返回布尔类型的值,一个返回int类型的值

//查找数组中是否由元素e
    public boolean contain(int e){
        for(int i=0;i<size;i++){
            if(data[i] == e){
                return true;
            }
        }
        return false;
    }
    //通过元素来查找数组的下标,如果存在返回下标,否则返回-1
    public int Find(int e){
        for(int i=0;i<size;i++){
            if(data[i] == e){
                return i;
            }
        }
        return -1;
    }

删除

删除其实和增加很像,都是数组中元素的移动
在这里插入图片描述*其实这边我更倾向于理解为运一个为null的元素,我在后面的图会更新的
在这里插入图片描述由此可以看见,我们的删除其实就是添加的逆过程,只不过添加是向后移动元素,删除是向前挪动元素来腾出空间。
最后不要忘记维护数组:size–;

  • 代码文件
    //删除
    public int remove(int index){
        if(size==data.length){
            throw new IllegalArgumentException("ADDLAST FAUILED");
        }
        //纪念一下这个牺牲的兄弟
        int ret = data[index];
        //集体向前移
        for(int i=index+1;i<size;i++){
            data[i-1]=data[i];
        }
        //维护一下
        size--;
        return  ret;
    }
    public int RemoveFirst(){
        return remove(0);
    }
    public int RemoveLast(){
        return remove(size-1);
    }
    public void RemoveElement(int e){
        //先去找这个元素
        int index = Find(e);
        //如果找到了,就把他删了
        if(index != -1){
            remove(index);
        }
    }

你们可以看到,这个复用的过程和增加是很像的。

  • 测试
package com.company;

public class Main {

    public static void main(String[] args) {
        // write your code here
        Array arr = new Array(20);
        for (int i = 0; i < 10; i++) {
            arr.addLast(i);
        }
        //System.out.println(arr);
        arr.add(1, 100);
        //System.out.println(arr);

        arr.addFirst(-1);
        //System.out.println(arr);

        System.out.println( arr.get(1));
        arr.set(10,1000000);
        System.out.println(arr);
        arr.remove(2);
        System.out.println(arr);
    }
}

运行结果:
可以看到变化了把。
在这里插入图片描述

总结

事上无难事,就怕太无聊没脑子又不敢去做(没错没错骂的就是我这个菜狗)
大家一起加油

课后测试

  • 数组怎么进行插入元素,具体的步骤是什么?代码怎么实现?
  • 怎么get和set元素?
  • 怎么查找是否包含这个元素?
  • 怎么删除这个元素?具体的步骤是什么?代码怎么实现?
以下是一份可能的蓝桥杯赛前训练计划: 1. 熟悉考试内容和题型:了解蓝桥杯考试的内容和题型,包括编程语言、数据结构算法、计算机基础知识和实践能力等方面的内容,并准备相关资料和练习题目。 2. 制定学习计划:根据自己的水平和时间安排,制定一份具体的学习计划,包括每天的学习目标、练习时间和计划完成时间等,以保证充分利用时间进行学习和练习。 3. 提高编程能力:进行编程练习,提高编程能力,特别是数据结构算法的实践能力。可以参加在线编程竞赛、练习题目和刷题等方式来提高编程能力。 4. 提高计算机基础知识:学习计算机基础知识,包括计算机组成原理、操作系统、计算机网络、数据库等方面的知识,以提高程序的效率和优化能力。 5. 实践能力:进行实践练习,包括操作系统和网络配置、数据库设计和开发、Web开发等方面的实践,以提高实践能力和解决问题的能力。 6. 团队协作:参加团队协作项目,锻炼团队合作和沟通能力,同时学习项目管理和软件开发流程等相关知识。 7. 模拟考试:进行模拟考试,以检验自己的学习成果和考试准备情况,同时找出自己的弱点和不足,加以改进和提高。 8. 调整状态:保持良好的身体状态和心态,保证充足的睡眠和饮食,调整好心态,保持积极向上的心态。 以上是一份可能的蓝桥杯赛前训练计划,具体的训练计划需要根据个人情况和水平来制定。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值