数据结构与算法——数组(So easy!)

本文详细介绍了数据结构在编程中的重要性,特别是数组的基础概念、构造方法以及一系列关键操作,如添加、修改元素、查找和删除,同时提供了LeetCode练习题链接,帮助读者巩固学习。
摘要由CSDN通过智能技术生成

目录

一.数据结构

!!!数据结构+算法=程序!!!

二.数组 

1.数组基础

2. 数组的常用方法

(1)构造方法

 (2)获取数组中实际存放元素个数

(3)获取容积大小

(4)判断数组是否为空

(5)向数组中添加元素

(6)修改指定位置的值

(7)获取指定索引位置的值 

(8)查询指定的值在数组中是否存在

(9)根据索引从数组中删除元素

 (10)向数组中指定位置添加元素

(11)  根据索引修改值

(12)重写ToString方法

练习: ​​​​1.两数之和 2.删除有序数组中的重复项​​


一.数据结构

1.数据结构介绍:

是计算机专业的一门基础学科,研究的是数据如何在计算机中进行组织和存储,使我们可以高效的获取数据和修改数据

2.数据结构可以分成三类:

  • 线性结构:数组,队列,栈,链表,哈希表.....
  • 树形结构:二叉树,二叉搜索树,AVL树,红黑树,堆,Trie,线段树,并查集…
  • 图结构:邻接矩阵,邻接表

!!!数据结构+算法=程序!!!

那么我们将正式进入数据结构与算法的学习~


二.数组 

1.数组基础

  • 数组是用来存储一组类型相同的数据
  • 数组在内存中的空间是连续分配的,创建数组时,要指明数组大小[数组一旦创建好之后,大小是不能改变的]
  • 访问数组是通过索引进行访问的[索引从0开始,最大值为arr.length-1]
  • 使用索引:获取指定索引位置的值;修改指定索引位置的值;删除数组元素;数组的遍历
  • 常见的错误: NullPointException    ArrayIndexOutOfBoundsException2

2. 数组的常用方法

    private int size;//数组中元素个数
    private int capacity;//数组的容量
    private T[] data;//数组中存的数据-----这里用到了泛型T

(1)构造方法

    public MyArray(int capacity) {
     //判断容积大小,当输入容量小于0时,我们给它固定一个容量,当大于0时,正常赋值
        if (capacity <= 0) {
            this.capacity = 10;
        } else {
            this.capacity = capacity;
            this.size = 0;
        }
        this.data = (T[]) new Object[capacity];
       //强制类型转换,Object为父类
    }
 (2)获取数组中实际存放元素个数
  public int getSize() {
        return this.size;
    }
(3)获取容积大小
  public int getCapacity() {
        return this.capacity;
    }
(4)判断数组是否为空
public boolean isEmpty() {
        return this.size == 0;
    }
(5)向数组中添加元素
  public void add(T item) {
        this.data[this.size] = item;
        this.size++;
    }
(6)修改指定位置的值

思路:先对参数(index)进行判断是否在有效范围内,再直接将data数组中所引为index的值改为value

 public void modifyValueByIndex(int index, T value) {
        if (index < 0 || index >= this.size) {
            throw new IllegalArgumentException("Index is invalid");
        }
        this.data[index] = value;
    }
(7)获取指定索引位置的值 
 public T getvalueByIndex(int index) {
        if (index < 0 || index >= this.size) {
            throw new IllegalArgumentException("Index is invalid");
        }
        return this.data[index];
    }
(8)查询指定的值在数组中是否存在

思路:首先进行入参判断,然后通过for循环获取索引,存在就返回i,不存在返回-1

注:为什么不返回0呢,是因为0也是一个索引

    public int containsValue(T value) {
        for (int i = 0; i < this.size - 1; i++) {
            if (this.data[i] == value) {
                return i;
            }
        }
        return -1;
    }
(9)根据索引从数组中删除元素

思路:首先进行入参判断,然后将要删除的值存在devlaue中,当数组的大小小于容量的1/4(防止复杂度震荡)且容量大于零时,可进行缩容

 public T removeByIndex(int index) {
        if (index < 0 || index >= this.size) {
            throw new IllegalArgumentException("Index is invalid");
        }
        T devlaue = this.data[index];
        //将删除元素都后面的元素进行前移,从后往前进行
        for (int i = index + 1; i < this.size; i++) {
            this.data[i + 1] = this.data[i];
        }
        this.size--;
        //删除元素到一定数量,可进行缩容
        if(this.size<this.capacity/4&&this.capacity>0){
            resize(this.capacity/2);
        }
        return devlaue;
    }
 (10)向数组中指定位置添加元素

思路:首先进行入参判断,然后在用for循环,将要插入位置的后面元素进行后移,这时候需要考虑如果当数组满了后,再进行插入操作就会出现溢出,所以就想到了扩容

      public void addindex(int index,T val){
        if (index < 0 || index >= this.size) {
            throw new IllegalArgumentException("Index is invalid");
        }
        for (int i =this.size-1 ; i >= index; i--) {
            this.data[i+1]=this.data[i];
        }  
        this.size++;
        //如果位置不够了可以进行扩容
        if(this.size==this.capacity){
             resize(this.capacity*2);
        }
        this.data[index]=val;
  • 扩容
 private void resize(int newCapacity){
        T[]redata=(T[]) new Object[newCapacity];
        for (int i = 0; i < this.size; i++) {
            redata[i]=this.data[i];
        }
        this.data=redata;
       this.capacity=newCapacity;
    }
(11)  根据索引修改值
    public void setValByIndex(int index,T val){
        if(index<0||index>=this.size){
            throw new IllegalArgumentException("Index is invalid.");
        }
        this.data[index]=val;
    }
(12)重写ToString方法
 @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < this.size; i++) {
            sb.append(this.data[i]);
            //不是每日一个值输出的时候后面都要加逗号
            if (i != this.size - 1) {
                sb.append(",");
            }
        }
        sb.append("]");
        return sb.toString();
    }

main函数我就不写了,主要方法就这几个,要学会灵活运用哟~

练习: 
​​​​​​力扣-1.两数之和​​​​​​icon-default.png?t=N7T8https://leetcode.cn/problems/two-sum/description/

力扣-26.删除有序数组中的重复项icon-default.png?t=N7T8https://leetcode.cn/problems/remove-duplicates-from-sorted-array/

加油!加油!加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值