数据结构(数组)

这篇具有很好参考价值的文章主要介绍了数据结构(数组)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一.数组的概念


    1. 数组定义

        数组(Array)是一种线性结构。它用一组连续的内存空间,来存储一组具有相同数据类型的数据。


   2. 数组的特点

        ①用来存储一组类型相同的数据。

        ②在内存中,分配连续的空间,数组创建时需要指定容量。因为数组为了保持内存的数据的连续性,所以会导致插入、删除这两个操作比较低效。

        ③数据类型[] 数组名 int[] arr = new int[10]; int[] arr2 = {1,2,3,4};

        ④访问数组中的数据时,通过索引访问,这也是数组的一大优点,可以实现随机访问(通过索引,时间复杂度为O(1)),所以随机访问时,效率比较高。 所以,数组是适合查找操作的,但查找的时间复杂度并不是O(1),即使是排好序的数组,使用二分查找法,时间复杂度也是(logn)。

        ⑤索引从0开始,最大到数组长度-1。索引从0开始,是因为索引(数组元素下标),确切的来说应该叫做偏移量,例如,arr[0]就表示偏移量为0的元素,也就是首地址。arr[k]就表示偏移量为k个type_size的位置。

        ⑥常见异常:NullPointException(空指针异常)、ArrayIndexOutOfBoundsException(数组索引越界异常)。

数据结构(数组),数据结构,算法

package com.gty.algo.lesson;

import java.util.Arrays;

public class ArrayDemo1 {
    public static void main(String[] args) {

        // 1.创建数组
        int[] arr = {11, 9, 1, 2, 26, 12};
        // 2.访问指定位置的值
        int num = arr[0]; //获取第一个位置的值
        System.out.println("num = " + num);
        // 3.修改指定位置的值
        arr[3] = 15;
        System.out.println("修改后的值为:" + arr[3]);
        // 4.遍历数组
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();

        // 5.数组中的异常(数组索引越界异常)
        System.out.println(arr[arr.length]); //ArrayIndexOutOfBoundsException

        // 空指针异常
        String[] s = new String[6];
        System.out.println(Arrays.toString(s)); //[null, null, null, null, null, null]
        System.out.println(s[0].length()); //NullPointerException

    }
}

数据结构(数组),数据结构,算法

数据结构(数组),数据结构,算法

注:

  • 数组是一段连续的内存空间,用户来存放具有相同数据类型的元素。
  • 在定义数组时,需要注意数组的类型和长度。类型决定了数组可以存储的元素的种类,长度定义了数组可以存储的元素的数量。
  • 在修改与访问数组时,要注意数组的索引,避免出现数组索引越界异常。在修改数组中的元素的值时,要注意数组中元素的数据类型,避免出现类型不一致的错误。
3.数组的遍历

        方法:for循环、for-each(增强for循环)、调用toString方法 。

package com.gty.algo.lesson;

import java.util.Arrays;

public class ArrayDemo1 {
    public static void main(String[] args) {
        int[] arr = {11, 9, 1, 2, 26, 12};
        /*
            数组的遍历
         */
        //1.for循环
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
        //2.for-each(增强for循环)
        for (int x:arr) {
            System.out.print(x + " ");
        }
        System.out.println();
        //调用toString方法
        System.out.println(Arrays.toString(arr));

    }
}

 二.封装数组

        基于java提供给我们的数组,进行二次封装,我们可以自己去写一个我们自己的数组(动态数组)去实现数组的各种基本功能。

1.封装数组

主要功能:

        添加元素,获取元素,查看当前数组中元素的个数,获取容积,修改元素,数组扩容,判空,查询指定元素,删除指定位置的元素。

package com.gty.algo.lesson.array;


// 支持泛型
public class MyArray<T> {

    private T[] arr;
    private int size;
    private int capacity; //容积


    // 构造方法
    public MyArray(int capacity) {
        // 入参判断
        if (capacity <= 0) {
            throw new IllegalArgumentException("输入容积异常!");
        }
        this.capacity = capacity;
        this.size = 0;
        this.arr = (T[]) new Object[this.capacity];
    }

    // 获取元素个数
    public int getSize() {
        return this.size;
    }

    // 获取容积
    public int getCapacity() {
        return this.capacity;
    }

    // 添加元素
    public void add(T item) {
        this.arr[this.size] = item;
        this.size++;
    }

    // 向指定位置添加元素
    public void addValueByIndex(int index, T value) {
        if (index < 0 || index > this.size) {
            throw new IllegalArgumentException("索引异常!");
        }
        if (this.size == this.capacity) {
            resize(this.capacity * 2);
        }
        for (int i = this.size - 1; i >= index; i--) {
            this.arr[i + 1] = this.arr[i];
        }
        this.arr[index] = value;
        this.size++;
    }

    // 扩容
    private void resize(int newCapacity) {
        T[] newArr = (T[]) new Object[newCapacity];

        for (int i = 0; i < this.size; i++) {
            newArr[i] = this.arr[i];
        }
        // 改变容器与容积
        this.arr = newArr;
        this.capacity = newCapacity;
    }

    // 判空
    public boolean isEmpty() {
        return this.size == 0;
    }

    // 修改元素
    public void modifyValueByIndex(int index, T value) {
        // 入参判断
        if (index < 0 || index > capacity) {
            throw new IllegalArgumentException("索引异常!");
        }
        this.arr[index] = value;
    }

    // 获取指定位置的值
    public T getValueByIndex(int index) {
        // 入参判断
        if (index < 0 || index > capacity) {
            throw new IllegalArgumentException("索引异常!");
        }
        return this.arr[index];
    }

    // 查询指定的值在数组中是否存在,存在返回索引,不存在返回-1
    public int containsValue(T value) {
        for (int i = 0; i < this.size; i++) {
            if (value.equals(this.arr[i])) {
                return i;
            }
        }
        return -1;
    }

    // 删除指定位置的元素
    public T deleteValueByIndex(int index) {
        // 入参判断
        if (index < 0 || index > capacity) {
            throw new IllegalArgumentException("索引异常");
        }
        // 1.找到删除的位置的元素
        T deValue = this.arr[index];
        // 2.将删除元素之后的元素前移
        for (int j = index + 1; j < this.size; j++) {
            this.arr[j - 1] = this.arr[j];
        }
        this.size--;
        // 判断是否缩容
        if (this.size <= this.capacity / 4 && this.capacity / 2 > 0) {
            resize(this.capacity / 2);
        }
        return deValue;
    }
    
    
    // 重写toString方法,用于数组打印
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append("{");
        for (int i = 0; i < this.size; i++) {
            sb.append(this.arr[i]);
            if (i < this.size - 1) {
                sb.append(",");
            }
        }
        sb.append("}");
        return sb.toString();
    }

}
 2.例题介绍

        两数之和(1. 两数之和 - 力扣(LeetCode))

  •  题解:可以利用Map,将数组中的值和其对应的索引以键值对的方式存放在Map中。遍历数组,当发现target - nums[i](这是解决本题的重点思想,将两数之和转换为两数之差(值1 - 值2 = 目标值 即为,目标值 - 值1 = 值2))在Map中,说明找到了目标值,返回target - nums[i]的下标和i即可。基于以上思想,在向Map中存放键值对时,可以将数组中元素的值作为键,元素在数组中的索引作为值存放在Map中,方便我们获取索引。
  • 代码实现
package com.gty.algo.subject;

import java.util.Arrays;
import java.util.HashMap;

public class LeetCode_01 {
    public int[] twoSum(int[] nums, int target) {
        // 入参判断
        if(nums == null || nums.length < 2){
            return null;
        }

        // 利用Map,将数组中的值和其对应的索引以键值对的方式存放起来,可以将值作为Map中的键,索引作为值,
        HashMap<Integer, Integer> map = new HashMap<>();
        // 遍历数组,求数组中两数之和等于目标值,即求目标值 - 值1 = 值2,
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if(map.containsKey(temp)){ //判断值是否存在
                return new int[]{map.get(temp),i}; //map.get(temp)---通过key获取key对应的value
            }else{
                map.put(nums[i],i); //向Map中添加元素
            }
        }
        return null;
    }


    public static void main(String[] args) {
        int [] nums = {2,7,11,15};
        LeetCode_01 leetCode_01 = new LeetCode_01();
        int [] res = leetCode_01.twoSum(nums,9);
        System.out.println(Arrays.toString(res)); //[0, 1]
    }
}

 数据结构(数组),数据结构,算法数据结构(数组),数据结构,算法文章来源地址https://www.toymoban.com/news/detail-824673.html

到了这里,关于数据结构(数组)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【数据结构和算法】寻找数组的中心下标

    Java基础合集 数据结构与算法合集 设计模式合集 多线程合集 分布式合集 ES合集 其他系列文章导航 文章目录 前言 一、题目描述 二、题解 2.1 前缀和的解题模板 2.1.1 最长递增子序列长度 2.1.2 寻找数组中第 k 大的元素 2.1.3 最长公共子序列长度 2.1.4 寻找数组中第 k 小的元素 2

    2024年02月04日
    浏览(38)
  • 数据结构与算法-数组(附阿里面试题)

            给你一个文件里面包含全国人民(14亿)的年龄数据(0~180),现在要你统计每一个年龄   有多少人?          给定机器为 单台+2CPU+2G内存。不得使用现成的容器,比如map等。 (这一句可以忽略)         在以上情况下你该如何以最高效的方法来解决这个

    2024年02月13日
    浏览(28)
  • 【数据结构和算法】使用数组的结构实现链表(单向或双向)

    上文我们通过结构体的结构实现了队列 、以及循环队列的实现,我们或许在其他老师的教学中,只学到了用结构体的形式来实现链表、队列、栈等数据结构,本文我想告诉你的是,我们 可以使用数组的结构实现链表、单调栈、单调队列 目录 前言 一、用数组结构的好处 1.数

    2024年01月20日
    浏览(51)
  • 【数据结构与算法——TypeScript】数组、栈、队列、链表

    解决问题 的过程中,不仅仅 数据的存储方式会影响效率,算法的优劣也会影响效率 什么是算法? 定义: 🟢 一个有限指令集,每条指令的描述不依赖于言语 (编写指令:java/c++/ts/js) 🟢 接收一些输入(有些情况下不需要输入)(接收:排序:无序数组) 🟢 产生输出 (

    2024年02月14日
    浏览(29)
  • 数据结构与算法·第5章【数组和广义表】

    两种顺序映象的方式: 以行序为主序(低下标优先); 以列序为主序(高下标优先)。 而 n n n 维数组: LOC(x1, x2, ..., xn) = LOC(0, 0, ..., 0) + [(x1 × b1 + x2) × b2 + x3] × b3 + ... + xn 数据类型定义 其中: A.bounds是每一维可以放多少元素: a[A.bounds[0]][A.bounds[1]][A.bounds[2]]…… A.constants是指向每

    2024年02月08日
    浏览(34)
  • 算法与数据结构(二十四)最优子结构原理和 dp 数组遍历方向

    注:此文只在个人总结 labuladong 动态规划框架,仅限于学习交流,版权归原作者所有; 本文是两年前发的 动态规划答疑篇open in new window 的修订版,根据我的不断学习总结以及读者的评论反馈,我给扩展了更多内容,力求使本文成为继 动态规划核心套路框架 之后的一篇全面

    2024年02月12日
    浏览(25)
  • 【数据结构与算法】Kadane‘s算法(动态规划、最大子数组和)

    Kadane\\\'s 算法是一种用于解决最大子数组和问题的动态规划算法。这类问题的目标是在给定整数数组中找到一个连续的子数组,使其元素之和最大(数组含有负数)。 算法的核心思想是通过迭代数组的每个元素,维护两个变量来跟踪局部最优解和全局最优解。 以下是Kadane’s算

    2024年03月22日
    浏览(87)
  • 头歌(C语言)-数据结构与算法-数组(共7关)

    任务描述 本关任务:将十个数进行从大到小的顺序进行排列。 相关知识(略) 编程要求 根据提示,在右侧编辑器 Begin-End 处补充代码。 输入 输入十个整数。 输出 以从大到小的顺序输出这个十个数。 测试说明 样例输入: 1 2 3 4 5 6 7 8 9 10 样例输出: 10 9 8 7 6 5 4 3 2 1 代码:

    2024年02月11日
    浏览(31)
  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)三

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月21日
    浏览(40)
  • 数据结构与算法教程,数据结构C语言版教程!(第五部分、数组和广义表详解)五

    数组和广义表,都用于存储逻辑关系为“一对一”的数据。 数组存储结构,99% 的编程语言都包含的存储结构,用于存储不可再分的单一数据;而广义表不同,它还可以存储子广义表。 本章重点从矩阵的角度讨论二维数组的存储,同时讲解广义表的存储结构以及有关其广度和

    2024年01月23日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包