首页 > 其他分享 >顺序表

顺序表

时间:2023-12-13 09:55:49浏览次数:22  
标签:顺序 ArrayList List System arrayList1 add out

1. 顺序表概念

什么是顺序表 ?

顺序表是一种新的数据类型,它使用一段物理地址连续的存储单元依次存储数据元素(数组实现),并具有操作(增删查改)这个数组的方法

数组也是使用连续的地址空间存储数据,那么数组和顺序表有什么区别 ?

数组是一个连续地址依次存储数据的简单结构, 而顺序表只是使用数组这个结构存储数据 顺序表本身还具备操作这个数组的功能 

2. 顺序表结构及实现

elem数组引用 指向存储数据的内存空间

size 记录当前顺序表中数据的个数

 

顺序表的实现:

https://github.com/znxcmakhsd/DS/tree/main/12-12/ArrayList

3. 认识ArrayList

3.1 三种构造方法

ArrayList是Java提供的一个泛型类,它和我们自己实现的顺序表在基本逻辑上没有区别

使用ArrayList实例化顺序表对象:

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        List<Integer> arrayList2 = new ArrayList<>();
    }
}

由于ArrayList实现了List接口,所以也可以使用List引用引用顺序表对象

 

ArrayList中的三种构造方法:

有参数的构造

无参构造

如图 使用无参构造构造对象时 不会给数组分配大小

那么 为什么可以插入数据 ? 

这里就得看add方法的实现

第三个构造方法:

 

3.2 ArrayList的6种遍历

import jdk.internal.org.objectweb.asm.tree.LineNumberNode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

public class Main {
    public static void main(String[] args) {
        ArrayList<Integer> arrayList1 = new ArrayList<>();
        arrayList1.add(1);
        arrayList1.add(2);
        arrayList1.add(3);

        // 第一种遍历:
        System.out.println(arrayList1);

        // 第二种遍历: for
        for (int i = 0;i < arrayList1.size();i++) {
            System.out.print(arrayList1.get(i) + " ");
        }
        System.out.println();

        // 第三种遍历: for-each
        for (Integer x:arrayList1) {
            System.out.print(x+" ");
        }
        System.out.println();

        // 第4种遍历: 迭代器 Iterator
        Iterator<Integer> it = arrayList1.iterator();
        while (it.hasNext()) {
            System.out.print(it.next()+" ");
        }
        System.out.println();

        // 第5种遍历: 迭代器 ListIterator
        ListIterator<Integer> it2 = arrayList1.listIterator();
        while (it2.hasNext()) {
            System.out.print(it2.next()+" ");
        }
        System.out.println();

        // 第6种遍历: 迭代器 ListIterator 从后->前
        ListIterator<Integer> it3 = arrayList1.listIterator(arrayList1.size());
        while (it3.hasPrevious()) {
            System.out.print(it3.previous()+" ");
        }
        System.out.println();
    }
}

3.3 ArrayList的应用

1. 一道cvte面试题:

str1: "welcome to cvte"

str2: "come"

删除str1中 所有出现在str2中的字符 要求使用ArrayList——》结果: w, l,  , t,  , v, t 

方法1: 

思路: 将str1中的每个字符遍历 判断该字符有没有在str2中,如果没有放入arrayList

public static List<Character> func1(String str1,String str2) {
        ArrayList<Character> arrayList = new ArrayList<>();
        for (int i = 0;i < str1.length();i++) {
            char ch = str1.charAt(i);
            if (!str2.contains(ch+"")) {
                arrayList.add(ch);
            }
        }
        return arrayList;
    }

这里需要注意: contains方法判断一个字符串是否有另一个字符串,字符ch需要加""转为字符串

方法2: 

思路和方法1一样 只是没有使用contains方法

public static List<Character> func2(String str1,String str2) {
        ArrayList<Character> arrayList = new ArrayList<>();
        for (int i = 0;i < str1.length();i++) {
            char ch = str1.charAt(i);
            int j = 0;
            for (;j < str2.length();j++) {
                if (str2.charAt(j) == ch) {
                    break;
                }
            }
            if (j == str2.length()) {
                arrayList.add(ch);
            }
        }
        return arrayList;
    }

2. 杨辉三角

题目链接:

https://leetcode.cn/problems/pascals-triangle/description/

先说明下 返回值的含义

在这道题中 List引用的是ArrayList对象, 所以List<List<Interger>>表示顺序表中每个元素类型是存储整形的顺序表对象 类似于二维数组, 如下图

解题思路:


class Solution {
    public List<List<Integer>> generate(int numRows) {
        List<List<Integer>> retArray = new ArrayList<>();
        
        // 提前插入第一行
        List<Integer> firstRow = new ArrayList<>(); 
        firstRow.add(1);
        retArray.add(firstRow);

        for (int i = 1;i < numRows;i++) {            
            List<Integer> array = new ArrayList<>(); 
            // 处理头
            array.add(1);
            // 处理中间
            for (int j = 1;j < i;j++) {
                List<Integer> lastRow = retArray.get(i-1);// 得到上一行
                array.add(lastRow.get(j-1)+lastRow.get(j));                
            }
            // 处理尾
            array.add(1);
            retArray.add(i,array);
        }
        return retArray;
    }
}

4. 顺序表的优缺点

缺点:

1. 插入删除元素 需要移动元素 复杂度为O(N) 不够好

2. 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的时间消耗

3. 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到200,我们再继续插入了5个数据,后面没有数据插入了,那么就浪费了95个数据空间。

优点:

给定一个下标,可以以O(1)复杂度快速找到对应元素

标签:顺序,ArrayList,List,System,arrayList1,add,out
From: https://www.cnblogs.com/xumu7/p/17896529.html

相关文章

  • Golang实现简易的顺序执行协程池
    countable_executor.go//一个可计数的单线程顺序任务执行器typeCountableExecutorstruct{namestring//名称taskQueuechaniCountableTask//任务队列bufferSizeint//缓冲区大小}//一个可计数的单线程任务......
  • 1.顺序表的简单操作
    1#include<stdio.h>2#include<stdlib.h>3#defineMaxSize504typedefintElemType;5typedefstruct{6ElemTypedate[MaxSize];7intlength;8}SqList;//定义顺序表的类型9//初始化顺序表10voidInitList(SqList*&L){11L=......
  • 序列计数器和顺序锁 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/locking/seqlock.html#序列计数器和顺序锁介绍序列计数器是一种具有无锁读取器(只读重试循环)和无写入者饥饿的读者-写者一致性机制。它们用于很少写入数据的情况(例如系统时间),其中读者希望获得一致的信息集,并且愿意在信息发生变化时重试......
  • C++ Qt开发:使用顺序容器类
    当我们谈论编程中的数据结构时,顺序容器是不可忽视的一个重要概念。顺序容器是一种能够按照元素添加的顺序来存储和检索数据的数据结构。它们提供了简单而直观的方式来组织和管理数据,为程序员提供了灵活性和性能的平衡。Qt中提供了丰富的容器类,用于方便地管理和操作数据。这些容......
  • 关于键盘导航顺序和 tabindex 属性的关联关系
    "tabindex"属性是HTML元素中的一个属性,用于定义元素在通过键盘导航时的顺序。该属性接受一个整数值,通常为正整数,用于指定元素的tab键顺序。但是,当"tabindex"属性的值为-1时,它有特殊的含义。当"tabindex"的值为-1时,它表示该元素虽然可以通过JavaScript聚焦,但在通过按下Tab键进行导......
  • maven访问仓库的顺序
    repository仓库配置文件有3个地方:1、默认中央仓库:Maven安装目录下lib/maven-model-builder-${version}.jar中\org\apache\maven\model\pom-4.0.0.xml文件配置着默认中央仓库,它是所有MavenPOM的父POM,所有Maven项目继承该配。<repositories><repository><id>centr......
  • Day21 顺序结构及选择结构中的If结构
    顺序结构Java的基本结构就是顺序结构,从上到下的顺序执行,是任何一种算法都离不开的基本算法结构packagecom.baixiaofan.struct;publicclassShunXuDemo{publicstaticvoidmain(String[]args){System.out.println("hello1");//按顺序一句一句执行......
  • @Transactional事务注解及请求接口的定义先后执行顺序设计
    @Transactional事务注解及请求接口的定义先后执行顺序设计1.事务内查询,可能存在事务没有提交,导致查询数据查不出来。2.或者可能跟请求参数作为查询条件,在某个条件下,请求参数发生变化,也会导致查询不出来。可以将在一个事务内的操作(定义为一个组,Group_ID),根据组号来查询。根据接口......
  • mybatis sql查询后,返回回来的字段顺序变了;在项目中通过mybatis查询数据库,同样的查询
    问题描述:过程就不看了直接上结果查询语句中的字段顺序信息和返回的字段信息不一致如图:realSql是查询语句,result是查询结果查询语句中的字段顺序信息和返回的字段信息不一致解决方案:转载地址这里复制一份防删......
  • JSONObject参数顺序问题
    签名需要规定参数顺序不能错。一开始是这么写的JSONObjectparam=newJSONObject();param.put("idcard",user.getIdCard());param.put("mobile",user.getPhone());param.put("uid",user.getId());param.put("username",user.getName());期望得到的顺序应该......