首页 > 编程语言 >算法 玩转数据结构 2-5 包含,搜索和删除

算法 玩转数据结构 2-5 包含,搜索和删除

时间:2022-09-28 09:14:03浏览次数:92  
标签:int 算法 玩转 数组 array 数据结构 data public size

0    课程地址

https://coding.imooc.com/lesson/207.html#mid=13410

 

1    重点关注

1.1    continue,break,return的区别

for循环中,continue结束本轮循环,break结束循环体,return 结束方法

 

1.2    设计方式:删除

删除数组列表等的索引的时候等,要返回删除元素的值

 

2    课程内容

见3

 

3    Coding

3.1    相关coding

逻辑类(重点关注5)

package com.company;

import java.util.Arrays;

public class Array {
    private int size;
    //int类型的数组
    private int[] data;


    //1.1  创建构造函数,传入容量,则新生成一个数组
    public Array(int capacity){
        data = new int[capacity];
        size = 0;
    }

    //1.2  创建无参构造函数
    public Array(){
        this(10);
    }

    //1.3  添加传入静态数组的构造函数
    public Array(int[] param){
        this.data = param;
        long outParm = Arrays.stream(param).filter(e->{
            return e>0;
        }).count();
        this.size = (int)outParm;
    }

    //2.1  添加getSize,获取数组元素个数
    public int getSize(){
        return size;
    }

    //2.2  添加getCapacity,获取数组容量
    public int getCapacity(){
        return data.length;
    }

    //2.3  添加数组是否为空方法
    public boolean isEmpty(){
        return size==0;
    }

    //3.1  在数组末尾添加元素
    public void addLast(int e){
        addElement(size,e);
    }

    //3.2  在数组起始添加元素
    public void addFirst(int e){
        addElement(0,e);
    }

    //3.3  数组根据索引添加元素
    public void addElement(int index,int e){
        //1     校验异常
        //1.1   如果数组已经满了,则禁止插入
        if(size== data.length){
            throw new IllegalArgumentException("数组已满,禁止插入");
        }

        //1.2   如果传入的索引在已有数组的索引之外,则校验异常
        if(index<0||index>size){
            throw new IllegalArgumentException("索引应在已有数组的索引之间");
        }

        //2     实现根据索引添加元素的逻辑
        //2.1   data同步
        for(int j = size-1;j>=index;j--){
            data[j+1] = data[j];
        }
        data[index] = e;

        //2.2   size同步
        size++;
    }

    //4.1     数组 toString 范例
    @Override
    public String toString() {
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(String.format("Array:size = %d,capacity = %d\n",size,data.length));

        stringBuffer.append("[");
        for(int i=0;i<size;i++){
            stringBuffer.append(data[i]);
            if(i!=size-1){
                stringBuffer.append(",");
            }
        }
        stringBuffer.append("]");
        return stringBuffer.toString();
    }

    //4.2     get获取元素
    public int get(int index){
        if(index<0||index>data.length){
            throw new IllegalArgumentException("111");
        }
        return data[index];
    }

    //4.3       set获取元素
    public void set(int index,int e){
        if(index<0||index>data.length){
            throw new IllegalArgumentException("111");
        }
        data[index] = e;
    }

    //5.1     数组包含
    public boolean contails(int e){
        for(int i = 0;i<size;i++){
            if(e==data[i]){
                return true;
            }
        }
        return false;
    }

    //5.2     数组搜索
    public int search(int e){
        for(int i = 0;i<size;i++){
            if(e==data[i]){
                return i;
            }
        }
        return -1;
    }

    //5.3     数组删除,通常情况下做删除,会在出参把删除的值带出来
    public int remove(int index){
        if(index<0||index>=size){
            throw new IllegalArgumentException("111");
        }
        int outParm = data[index];
        for(int i=index;i<size-1;i++){
            data[i] = data[i+1];
        }
        //这块不塞值也没有任何影响,因为size已经--了,不会访问到size之外的元素
        data[size-1]= 0;
        size--;
        return outParm;
    }

    //5.4       删除首个元素
    public int removFirst(){
        return remove(0);
    }

    //5.5       删除最后的元素
    public int removLast(){
        return remove(size-1);
    }

    //5.6       删除指定的元素
    public void removElement(int e){
        int index = -1;
        //判断删除的元素是否存在
        for(int i=0;i<size;i++){
            if(e==data[i]){
                index = i;
                break;
            }
        }
        if(index>=0){
            remove(index);
        }else{
            throw new IllegalArgumentException("删除的元素未找到");
        }
    }


}

 

测试类

public static void main(String[] args) {
        int[] parm = new int[]{1,2,3,4,4,5,6,7};
        Array array = new Array(parm);

        System.out.println(array.contails(7));
        System.out.println(array.contails(8));

        System.out.println(array.search(4));
        System.out.println(array.search(8));

        System.out.println(array.remove(1));
        System.out.println(array);
        System.out.println(array.removFirst());
        System.out.println(array);
        System.out.println(array.removLast());
        System.out.println(array);

        array.removElement(4);
        System.out.println(array);
        array.removElement(8);
    }

 

标签:int,算法,玩转,数组,array,数据结构,data,public,size
From: https://www.cnblogs.com/1446358788-qq/p/16736785.html

相关文章

  • 算法练习-第六天【哈希表】
    哈希表(二)454.四数相加II参考:代码随想录454.四数相加思路题目中给出了四个长度相同数组,并且要求求出组成结果为0的四元组。答案可以包含重复的四元组。先使用哈希表......
  • 前端加密算法之MD5
    1、简介1.1、隶属于单向加密算法1.2、不可逆的加密算法、不能从密文反推出明文,除非做碰撞测试1.3、一种摘要算法、哈希算法、散列算法(通过一个函数,把任意......
  • 前端加密算法之RSA
    1、简介RSA为非对称加密算法,即加密解密密钥不一致,公私钥成对出现。一般而言,公钥是公开的,在前端页面我们都是可以看到的,而私钥则是不公开的,用于在后端对前端发来的密......
  • 算法设计与分析课-实验-贪心
    算法设计与分析课贪心算法第一题最小延迟调度:贪心算法的基本思想:贪心算法的基本思想为从整体中找到每个小局部的最优解,并将所有局部最优解合并成整体的最优解。能够......
  • mitudesk的机器学习日记 基础算法之K最近邻
    1.K最近邻的思路很简单,就是计算其离最近的比较其所属,最少需要两个不同的标签,最多无上限,当N太小时会存在过拟合的情况,会受到极小的点的印象当n太大,以至于超过待分类的数据,......
  • 基2时间抽取FFT算法推导,及C语言实现
    https://blog.csdn.net/qq_38677310/article/details/99663883 https://wenku.baidu.com/view/af198ef01a5f312b3169a45177232f60ddcce77d.html......
  • Golang-常用算法
    快速排序funcQuickSort(sort[]int)[]int{ iflen(sort)<=1{ returnsort } low:=make([]int,0,0) mid:=make([]int,0,0) high:=make([]int,0,0......
  • 数据结构学习----树的遍历
    树的遍历前言在一个平常的星期二下午,一节数据结构课中,想着做点什么的我,打开了力扣。正好老师在讲树,我也从二叉树最基础的遍历开始刷题,没想到打开了新世界的大门····......
  • AcWing 算法提高课 线段树+扫描线法 求矩形之并的面积
    例题:求解多个长方形之并的面积https://www.acwing.com/problem/content/249/蓝色表示长方形,红色表示扫描线如下图所示,对于每一个横向的区间,在纵向维护线段树根据纵向......
  • 前端加密算法之CBC-AES
    1、简介CBC模式的AES加密相比较于ECB模式,多了一个偏移量,所以安全性要比ECB模式高2、核心加密js注:和前篇ECB模式一样这里都是直接采用调用js的方式实现了加密,当......