算法----数组常见知识点

2023-09-21 10:54:23

1. 在Java中,数组可以分为以下几种类型:

  1. 一维数组:一维数组是最常见的数组类型,它包含一系列具有相同数据类型的元素。数组中的每个元素可以通过索引访问,索引从0开始。

  2. 二维数组:二维数组是由一维数组组成的数组。它可以被看作是一个表格或者矩阵,其中的元素可以通过两个索引进行访问。每个元素都是由行索引和列索引确定的。

  3. 多维数组:多维数组是由一维或二维数组组成的数组。例如,三维数组由一系列二维数组组成,四维数组由一系列三维数组组成,以此类推。

此外,还有两种特殊类型的数组:

  1. 动态数组(ArrayList):动态数组是一种可以自动调整大小的数组,它可以根据需要动态添加或删除元素。

  2. 不规则数组:不规则数组是指每个一维数组的长度可以不同的二维数组。不规则数组在某些情况下可以提供更灵活的数据存储和处理方式。

2. 在Java中,数组需要进行初始化才能使用。

在声明数组时,需要指定数组的类型和大小。初始化数组有两种方法:静态初始化和动态初始化。

  1. 静态初始化:静态初始化是在声明数组时直接为数组元素赋予初始值。语法如下:

    数据类型[] 数组名 = {元素1, 元素2, ...};
    

    例如,可以通过以下方式静态初始化一个整型数组:

    int[] numbers = {1, 2, 3, 4, 5};
    

    静态初始化可以在声明数组时一次性完成,非常方便。

  2. 动态初始化:动态初始化是在声明数组时只指定数组的类型和大小,并没有为数组元素赋初值。语法如下:

    数据类型[] 数组名 = new 数据类型[数组大小];
    

    例如,可以通过以下方式动态初始化一个整型数组:

    int[] numbers = new int[5];
    

    动态初始化后,数组的每个元素的初始值将根据数据类型的默认值进行赋值,如int类型默认为0。

需要注意的是,一旦数组被初始化,其大小就无法再更改。如果需要动态调整数组的大小,可以考虑使用动态数组(ArrayList)来代替。

3. 在Java中,不同类型的数组具有不同的性质和常用方法。

以下是一些常见的数组类型及其特点和常用方法:

  1. 一维数组:

    • 性质:一维数组是由具有相同数据类型的元素组成的。数组的长度是固定的,一旦创建,无法改变。
    • 常用方法:
      • length:返回数组的长度。
      • clone:创建并返回一个数组的副本。
      • toString:将数组转换为字符串。
  2. 二维数组:

    • 性质:二维数组是由一维数组组成的数组,可以看作是一个表格或矩阵。
    • 常用方法:
      • length:返回数组的长度(即行数)。
      • length:返回指定行的长度(即列数)。
  3. 多维数组:

    • 性质:多维数组是由一维或二维数组组成的数组,可以有更多的维度。
    • 常用方法:多维数组的常用方法与一维数组和二维数组类似。
  4. 动态数组(ArrayList):

    • 性质:动态数组是一种可以自动调整大小的数组,可以动态添加或删除元素。
    • 常用方法:
      • add:向数组末尾添加元素。
      • remove:从数组中删除指定元素。
      • size:返回数组的大小。
      • get:获取指定索引位置的元素。
      • set:设置指定索引位置的元素。
      • toArray:将数组转换为普通的数组。

4. 求二维数组的边长度,可以通过使用数组的length属性来获取。

在Java中,二维数组实际上是由一维数组组成的数组。因此,二维数组的边长度就是它包含的一维数组的数量。

下面是一个示例代码:

public class Main {
    public static void main(String[] args) {
        int[][] twoDimensionalArray = {
            {1, 2, 3},
            {4, 5, 6},
            {7, 8, 9}
        };

        int rows = twoDimensionalArray.length; // 获取二维数组的行数
        int columns = twoDimensionalArray[0].length; // 获取二维数组的列数

        System.out.println("二维数组的行数:" + rows);
        System.out.println("二维数组的列数:" + columns);
    }
}

在这个示例中,我们创建了一个二维数组twoDimensionalArray,并初始化了3行3列的数组。通过使用length属性,我们可以获取二维数组的行数和列数。在这个示例中,我们分别使用twoDimensionalArray.length获取行数,使用twoDimensionalArray[0].length获取列数。最后,我们将行数和列数打印出来。

  • 需要注意的是,如果二维数组是不规则的,也就是说每一行的列数不相等,那么获取边长度的方法会有所不同。在这种情况下,你需要遍历每一行,获取每一行的长度,然后找出最大的长度作为边长度。

5. 栈

  • 栈是一种后进先出(LIFO)的数据结构,类似于一叠盘子,只能从顶部插入和删除元素。
  • Java中的栈可以用Stack类或者Deque接口的实现类(如ArrayDeque)来实现。
  • 常用的栈操作包括push(将元素压入栈顶)、pop(将栈顶元素弹出)和peek(获取栈顶元素但不弹出)等。

示例代码:

Stack<Integer> stack = new Stack<>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println(stack.pop());  // 输出3
System.out.println(stack.peek());  // 输出2
  • 使用栈解决括号匹配问题

我们可以遍历字符串,当遇到左括号时,将其压入栈中;当遇到右括号时,检查栈顶元素是否为对应的左括号,如果是,则弹出栈顶元素,继续遍历;如果不是,则说明括号不匹配,返回false。最后检查栈是否为空,如果为空,则说明所有括号都匹配,返回true。

public static boolean isParenthesesMatch(String str) {
    Stack<Character> stack = new Stack<>();

    for (char c : str.toCharArray()) {
        if (c == '(' || c == '[' || c == '{') {
            stack.push(c);
        } else if (c == ')' || c == ']' || c == '}') {
            if (stack.isEmpty()) {
                return false;
            }
            char top = stack.peek();
            if ((c == ')' && top == '(') || (c == ']' && top == '[') || (c == '}' && top == '{')) {
                stack.pop();
            } else {
                return false;
            }
        }
    }

    return stack.isEmpty();
}

6. 队列

  • 队列是一种先进先出(FIFO)的数据结构,类似于排队,只能从队尾插入元素,从队头删除元素。
  • Java中的队列可以用Queue接口的实现类(如LinkedList)来实现。
  • 常用的队列操作包括offer(将元素插入队尾)、poll(删除队头元素并返回)和peek(获取队头元素但不删除)等。

示例代码:

Queue<Integer> queue = new LinkedList<>();
queue.offer(1);
queue.offer(2);
queue.offer(3);
System.out.println(queue.poll());  // 输出1
System.out.println(queue.peek());  // 输出2
  • 使用队列实现对二叉树的层次遍历问题
import java.util.LinkedList;
import java.util.Queue;

// 定义二叉树节点
class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;

    TreeNode(int val) {
        this.val = val;
    }
}

public class LevelOrderTraversal {
    public static void levelOrder(TreeNode root) {
        if (root == null) {
            return;
        }

        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            System.out.print(node.val + " ");

            if (node.left != null) {
                queue.offer(node.left);
            }

            if (node.right != null) {
                queue.offer(node.right);
            }
        }
    }

    public static void main(String[] args) {
        // 创建二叉树
        TreeNode root = new TreeNode(1);
        root.left = new TreeNode(2);
        root.right = new TreeNode(3);
        root.left.left = new TreeNode(4);
        root.left.right = new TreeNode(5);
        root.right.left = new TreeNode(6);
        root.right.right = new TreeNode(7);

        // 层次遍历二叉树
        System.out.print("层次遍历结果:");
        levelOrder(root);
    }
}

运行以上代码,输出结果为:1 2 3 4 5 6 7,表示对二叉树进行层次遍历的结果。

更多推荐

MySQL常考知识点

MySQL常考知识点索引的基本原理索引设计的原则事务的基本特性和隔离级别什么是MVCC简述MyISAM和InnoDB的区别Explain语句结果中各个字段分表表示什么索引覆盖是什么最左前缀原则是什么B树和B+树的区别,为什么Mysql使⽤B+树Mysql锁有哪些,如何理解Mysql慢查询该如何优化?索引的基本原理索引⽤

blender怎么设置中文界面

你们知道Blender软件是什么吗?你知道blender怎么设置中文界面吗?Blender是个GNU的3D绘图软件,建模、算图、动画等功能都相当的完整,可以说已经具有了一般商业软件的规模。Blender大部分的功能都有热键,操作起来相当地轻快;而由于几乎所有的功能按钮鼠标移上去一段时间都会出现详细说明,也多少弥补了操作

Blender Morph Targets

推荐:用NSDT编辑器快速搭建可编程3D场景在Blender中,MorphTarget被称为ShapeKey,即形状键,是将网格从一种形状变形为另一种形状的工具。每个对象都被分配了一个基本形状,然后可以有许多可以变形的形状键。形状键通常用于面部动画和肌肉,但在动画中也有很多用途。本文包含了你需要了解的有关Blender

基于协同过滤算法的旅游推荐系统

博主主页:猫头鹰源码博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万+、专注Java技术领域和毕业设计项目实战主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询文末联系获取项目介绍:该系统基于springboot技术,数据层为MyBatis,mysql

python-爬虫-requests

安装模块pipinstallrequests在jupyternotebook里使用Shift+Tab查看requestsrequests库的主要方法方法解释requests.requset()构造一个请求,支持以下各种方法requests.get()获取HTML的主要方法requests.head()获取HTML头部信

ffmpeg 特效 转场 放大缩小

案例ffmpeg\-iinput.mp4\-iimage1.png\-iimage2.png\-filter_complex\[1:v]scale=100:100[img1];\[2:v]scale=1280:720[img2];\[0:v][img1]overlay=(main_w-overlay_w)/2:(mai

A Span-based Multi-Modal Attention Network for joint entity-relationextraction

原文链接:https://www.sciencedirect.com/science/article/pii/S0950705122013247?via%3DihubKnowledge-BasedSystems2023介绍作者认为当前基于span的关系提取方法都太关注于span内部的语义,忽略了span与span之间以

MySQL 深度分页性能急剧下降,该如何优化?

1、背景mysql使用select*limitoffset,rows分页在深度分页的情况下。性能急剧下降。例如:select*的情况下直接⽤limit600000,10扫描的是约60万条数据,并且是需要回表60W次,也就是说⼤部分性能都耗在随机访问上,到头来只⽤到10条数据(总共取600010条数据只留10条记录)2、

vue3 - 项目集成vue-i18n国际化和Element Plus 国际化

GitHubDemo地址在线预览vue3-项目集成vue-i18n国际化和ElementPlus国际化[GitHubDemo地址](https://github.com/iotjin/jh-vue3-admin)[在线预览](https://iotjin.github.io/jh-vue3-admin)一、vue-i1

DIY 一个汽车方向盘游戏外设(MMOS OSW DIY)

OSW-MMOS直驱方向盘DIY过程记录-简书(jianshu.com)DIY一个汽车方向盘游戏外设(MMOSOSWDIY)首先讲一下这个直驱系统大概的框架,首先是电脑,电脑里装MMOS的软件(这个软件国内高手把它汉化了的),电脑通过USB线,连接一个stm32板,这个stm32板上刷MMOS的固件,这个STM32板再

中文读唇总动员:CNVSRC 2023 视觉语音识别挑战赛启动

由NCMMSC2023组委会发起,清华大学、北京邮电大学、海天瑞声、语音之家共同主办的CNVSRC2023中文连续视觉语音识别挑战赛即日启动,诚邀参与报名。赛事官网:http://cnceleb.org/competition视觉语音识别,也称唇语识别,是一项通过口唇动作来推断发音内容的技术。该技术在公共安全、助老助残

热文推荐