Java复习第四天

news2025/1/23 22:30:47
一、代码题

1.相同的树

(1)题目

给你两棵二叉树的根节点p和q,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

  • 示例 1: 输入:p=[1,2,3],q=[1,2,3] 输出:true
  • 示例 2: 输入:p =[1,2],q=[1,null,2] 输出:false
  • 示例 3: 输入:p=[1,2,1],q =[1,1,2] 输出:false

(2)思路实现

a.题目实现

  • 如果两个节点都为空,则它们是相同的。
  • 如果其中一个节点为空而另一个不为空,则它们不同。
  • 如果两个节点的值不同,则它们不同。
  • 如果两个节点的值相同,则递归地检查它们的左子树和右子树是否相同。

b.代码实现

  • 定义一个递归函数 isSameTree,接受两个 TreeNode 类型的参数 p 和 q。
  • 首先检查两个节点是否都为空,如果是,则返回 true。
  • 然后检查其中一个节点是否为空而另一个不为空,如果是,则返回 false。
  • 接着检查两个节点的值是否相同,如果不同,则返回 false。
  • 最后递归地检查两个节点的左子树和右子树是否相同,只有当两者都返回 true 时,才返回 true。

(3)代码实现

package com.thor.test;

public class Demo {
    public static void main(String[] args) {
        //示例 1: 输入:p=[1,2,3],q=[1,2,3] 输出:true
        TreeNode p1 = new TreeNode(1, new TreeNode(2), new TreeNode(3));
        TreeNode q1 = new TreeNode(1, new TreeNode(2), new TreeNode(3));
        System.out.println(new TreeNode.Solution().isSameTree(p1,q1));
        //示例 2: 输入:p =[1,2],q=[1,null,2] 输出:false
        TreeNode p2 = new TreeNode(1, new TreeNode(2), null);
        TreeNode q2 = new TreeNode(1, null, new TreeNode(2));
        System.out.println(new TreeNode.Solution().isSameTree(p2,q2));
        //示例 3: 输入:p=[1,2,1],q =[1,1,2] 输出:false
        TreeNode p3 = new TreeNode(1, new TreeNode(2), new TreeNode(1));
        TreeNode q3 = new TreeNode(1, new TreeNode(1), new TreeNode(2));
        System.out.println(new TreeNode.Solution().isSameTree(p3,q3));
    }

}
class TreeNode {
    int val;//节点值
    TreeNode left;//左子节点
    TreeNode right;//右子节点
    
    TreeNode() {}//无参构造
    TreeNode(int val) {this.val = val;}//有参构造

    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }//有参构造

    static class Solution {
        public boolean isSameTree(TreeNode p, TreeNode q) {
            //如果两个节点都为空,则他们相同
            if(p==null&&q==null){
                return true;
            }
            //如果其中一个节点为空,另一个不为空,则他们不同
            if(p==null||q==null){
                return false;
            }
            //如果两个节点的值不同,则他们不同
            if(p.val!=q.val){
                return false;
            }
            //递归低检查两个节点的左子树和右子树是否相等
            return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
        }
    }
}

2.对称二叉树

(1)题目

你一个二叉树的根节点root,检查它是否轴对称。

  • 示例1: 输入:root=[1,2,2,3,4,4,3] 输出:true
  • 示例 2: 输入:root=[1,2,2,null,3,null,3] 输出:false

(2)思路实现

a.题目实现

  • 如果树为空,则它是对称的。
  • 定义一个辅助函数 isMirror,用于检查两个子树是否互为镜像。
  • 在 isMirror 函数中,首先检查两个节点是否都为空,如果是,则它们是对称的。
  • 然后检查其中一个节点为空而另一个不为空,如果是,则它们不对称。
  • 接着检查两个节点的值是否相同,如果不同,则它们不对称。
  • 最后递归地检查一个节点的左子树和另一个节点的右子树是否互为镜像,以及一个节点的右子树和另一个节点的左子树是否互为镜像

b.代码实现

  • 定义一个递归函数 isSymmetric,接受一个 TreeNode 类型的参数 root。
  • 如果 root 为空,则返回 true。
  • 调用辅助函数 isMirror,传入 root 的左子树和右子树。
  • 定义辅助函数 isMirror,接受两个 TreeNode 类型的参数 p 和 q。
  • 在 isMirror 函数中,首先检查两个节点是否都为空,如果是,则返回 true。
  • 然后检查其中一个节点为空而另一个不为空,如果是,则返回 false。
  • 接着检查两个节点的值是否相同,如果不同,则返回 false。
  • 最后递归地检查一个节点的左子树和另一个节点的右子树是否互为镜像,以及一个节点的右子树和另一个节点的左子树是否互为镜像。

(3)代码实现

package com.thor.test;

public class Demo {
    public static void main(String[] args) {
        // 示例 1
        TreeNode root1 = new TreeNode(1,
                new TreeNode(2, new TreeNode(3), new TreeNode(4)),
                new TreeNode(2, new TreeNode(4), new TreeNode(3))
        );
        System.out.println(new Solution().isSymmetric(root1)); // 输出: true

        // 示例 2
        TreeNode root2 = new TreeNode(1,
                new TreeNode(2, null, new TreeNode(3)),
                new TreeNode(2, null, new TreeNode(3))
        );
        System.out.println(new Solution().isSymmetric(root2)); // 输出: false
    }
}

class TreeNode {
    int val; // 节点值
    TreeNode left; // 左子节点
    TreeNode right; // 右子节点
    TreeNode() {
    } // 无参构造
    TreeNode(int val) {
        this.val = val;
    } // 有参构造
    TreeNode(int val, TreeNode left, TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    } // 有参构造
}
class Solution {
    public boolean isSymmetric(TreeNode root) {
        // 如果树为空,则它是对称的
        if (root == null) {
            return true;
        }
        // 调用辅助函数检查左子树和右子树是否互为镜像
        return isMirror(root.left, root.right);
    }
    private boolean isMirror(TreeNode p, TreeNode q) {
        // 如果两个节点都为空,则它们是对称的
        if (p == null && q == null) {
            return true;
        }
        // 如果其中一个节点为空而另一个不为空,则它们不对称
        if (p == null || q == null) {
            return false;
        }
        // 如果两个节点的值不同,则它们不对称
        if (p.val != q.val) {
            return false;
        }
        // 递归地检查一个节点的左子树和另一个节点的右子树是否互为镜像
        // 以及一个节点的右子树和另一个节点的左子树是否互为镜像
        return isMirror(p.left, q.right) && isMirror(p.right, q.left);
    }
}
二、集合

1.简介

2.ArrayList

(1)注意:声明的时候,最好采用多态的形式,就是父类引用指向子类对象

原因:关于可重复,有序操作的方法,都是在接口中已经定义好了;利于多态

(2)代码

List list =new ArrayList();
//增
list.add(1);
list.add(2);
list.add(3);
list.add(1);
//查
for (int i = 0; i < list.size(); i++) {
	System.out.println(list.get(i));
}

(3)单元测试——@Test

@Test
public void f01() {
	List list = new ArrayList();
	//增
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(1);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
}
@Test
public void f02() {
	List list = new ArrayList();
	//增
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(1);
	//删
	list.remove(1);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
}
@Test
public void f03() {
	List list = new ArrayList();
	//增
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(1);
	//改
	list.set(0, 4);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
}

3.LinkedList

(1)代码

@Test
public void f01() {
	List list = new LinkedList();
	//增
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(1);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
}
@Test
public void f02() {
	List list = new LinkedList();
	//增
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(1);
	//删
	list.remove(1);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
}
@Test
public void f03() {
	List list = new LinkedList();
	//增
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(1);
	//改
	list.set(0, 4);
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i));
	}
}

(2)特殊方法

4.List、ArrayList、LinkedList 区别

List

ArrayList

LinkedList

同点:二者都是有序的,父类为List

不同点:二者的底层结构不一样。

ArrayList的底层数据结构的数组结构,数组结构有个特点是查询快,因为它里面有索引,但是增加和删除慢,因为增加的时候需要考虑扩容机制。

LinkedList的底层数据结构是链表结构,链表结构增加和删除快,因为它们内部都有一个节点保存其地址值。但是查询慢,因为它们没有对应的索引操作

5.练习题

题目:如何存储多条狗狗信息,获取狗狗总数,逐条打印出各条狗狗信息 ?

package com.thor.test;

import org.junit.Test;

import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

public class Demo {
    @Test
    public void f01() {
        List list = new ArrayList();
        //增
        list.add(new Dog("欧欧","雪纳瑞"));
        list.add(new Dog("豆豆","泰迪"));
        list.add(new Dog("花花","金毛"));
        list.add(new Dog("美美","哈士奇"));
        System.out.println("共计有"+list.size()+"条狗");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}
class Dog{
    private String name;
    private String strain;

    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", strain='" + strain + '\'' +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Dog dog = (Dog) o;
        return Objects.equals(name, dog.name) && Objects.equals(strain, dog.strain);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, strain);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getStrain() {
        return strain;
    }

    public void setStrain(String strain) {
        this.strain = strain;
    }

    public Dog(String name, String strain) {
        this.name = name;
        this.strain = strain;
    }
}

6.Set

Set 入门案例

  • Set 不能重复,无序;遍历用增强 for,因为无序,没有索引。
  • 代码
@Test
public void f01() {
	Set set = new HashSet();
	//增
	set.add("中国");
	set.add("美国");
	set.add("中国");
	set.add("日本");
	set.add("韩国");
	System.out.println(set.size());
	for (Object o : set) {
		System.out.println(o);
	}
}

7.Map

  • Map 入门案例
  • Map 是双列集合
  • 新增是(key value 结构),key 不能重复,value 可以重复
  • 新增和修改用的是同一个方法——put
  • 代码
@Test
public void f01() {
	Map map = new HashMap();
	map.put("China","中国");
	map.put("American","美国");
	map.put("England","英国");
	map.put("Japan","日本");
	map.put("China1","中国");
	System.out.println(map.size());
	//查
	Set set = map.keySet();
	//增强for
	for (Object key : set) {
		Object value = map.get((String) key);
		System.out.println(key+ " : "+ value);
	}
}

8.迭代器——Iterator

  • 所有的增强 for 循环,底层实际上是依赖于迭代器Iterator

(1)有序

@Test
public void f01() {
	ArrayList<Integer> list = new ArrayList<>();
	list.add(1);
	list.add(2);
	list.add(3);
	list.add(4);
	System.out.println("\n遍历方式1");
	for (int i = 0; i < list.size(); i++) {
		System.out.println(list.get(i)+" ");
	}
	System.out.println("\n遍历方式2");
	for (Integer i : list) {
		System.out.println(i + " ");
	}
	System.out.println("\n遍历方式3");
	Iterator<Integer> iterator = list.iterator();
	while(iterator.hasNext()){
		System.out.println(iterator.next()+" ");
	}
}

(2)无序

@Test
public void f01() {
	Set<Integer> set = new HashSet<>();
	set.add(1);
	set.add(2);
	set.add(6);
	set.add(4);
	System.out.println("\n遍历方式1");
	for (Integer i : set) {
		System.out.println(i + " ");
	}
	System.out.println("\n遍历方式2");
	Iterator<Integer> iterator = set.iterator();
	while (iterator.hasNext()) {
		System.out.println(iterator.next() + " ");
	}
}

9.Collections 集合框架工具类

@Test
    public void f01() {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i < 11; i++) {
            list.add(i);
        }
        //洗牌
        Collections.shuffle(list);
        System.out.println("洗牌的结果为:" + list + " ");
    }
    @Test
    public void f02() {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i < 11; i++) {
            list.add(i);
        }
        //洗牌
        Collections.reverse(list);
        System.out.println("洗牌反转后的结果为:" + list + " ");
    }
    @Test
    public void f03() {
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i < 11; i++) {
            list.add(i);
        }
        //洗牌
        Collections.addAll(list,11,12);
        System.out.println("洗牌追加后的结果为:" + list + " ");
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2281110.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

修改word的作者 最后一次保存者 总编辑时间 创建时间 最后一次保存的日期

作者&#xff1a; 1.打开word文件 2.点击左上角的文件 3.选项 4.用户信息 5.将用户信息中的 姓名改为你需要的名字 最后一次保存者 1.word重命名为.zip文件 2.docProps中有个core.xml 3.用记事本打开有个lastModifiedBy标签&#xff0c;将里面内容改为你需要的名字 总编辑时…

C++之初识模版

目录 1.关于模版的介绍 2.函数模版 2.1函数模板概念 2.2函数模板格式 2.3 函数模板的原理 2.4 函数模板的实例化 2.5模板参数的匹配原则 3.类模版 3.1类模板的定义格式 3.2 类模板的实例化 1.关于模版的介绍 C中的模板是一种通用编程工具&#xff0c;它允许程序员编…

题解 CodeForces 131D Subway BFS C++

题目传送门 Problem - 131D - Codeforceshttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/Dhttps://codeforces.com/problemset/problem/131/D 翻译 地铁方案&#xff0c;对于Berland城市来说是一种经典的表示&#xff0c;由…

【STM32】-TTP223B触摸开关

前言 本文章旨在记录博主STM32的学习经验&#xff0c;我自身也在不断的学习当中&#xff0c;如果文章有写的不对的地方&#xff0c;欢迎各位大佬批评指正。 准备工作 今天这篇文章介绍的是触摸开关这一外围硬件。 ST-link调试器STM32最小系统板单路TTP223B触摸传感器模块LE…

ceph基本概念,架构,部署(一)

一、分布式存储概述 1.存储分类 存储分为封闭系统的存储和开放系统的存储&#xff0c;而对于开放系统的存储又被分为内置存储和外挂存储。 外挂存储又被细分为直连式存储(DAS)和网络存储(FAS)&#xff0c;而网络存储又被细分网络接入存储(NAS)和存储区域网络(SAN)等。 DAS(D…

Apache Hive3定位表并更改其位置

Apache Hive3表 1、Apache Hive3表概述2、Hive3表存储格式3、Hive3事务表4、Hive3外部表5、定位Hive3表并更改位置6、使用点表示法引用表7、理解CREATE TABLE行为 1、Apache Hive3表概述 Apache Hive3表类型的定义和表类型与ACID属性的关系图使得Hive表变得清晰。表的位置取决于…

计算机网络介质访问控制全攻略:从信道划分到协议详解!!!

一、信道划分介质访问控制 介质访问控制&#xff1a;多个节点共享同一个“总线型”广播信道时&#xff0c;可能发生“信号冲突” 应该怎么控制各节点对传输介质的访问&#xff0c;才能减少冲突&#xff0c;甚至避免冲突? 时分复用(TDM) 时分复用&#xff1a;将时间分为等长的“…

IJCAI-2024 | 具身导航的花样Prompts!VLN-MP:利用多模态Prompts增强视觉语言导航能力

作者&#xff1a; Haodong Hong1,2 , Sen Wang1∗ , Zi Huang1 , Qi Wu3 and Jiajun Liu2,1 单位&#xff1a;昆士兰大学&#xff0c;澳大利亚科学与工业研究组织&#xff0c;阿德莱德大学 论文标题&#xff1a;Why Only Text: Empowering Vision-and-Language Navigation wi…

C语言程序设计十大排序—冒泡排序

文章目录 1.概念✅2.冒泡排序&#x1f388;3.代码实现✅3.1 直接写✨3.2 函数✨ 4.总结✅ 1.概念✅ 排序是数据处理的基本操作之一&#xff0c;每次算法竞赛都很多题目用到排序。排序算法是计算机科学中基础且常用的算法&#xff0c;排序后的数据更易于处理和查找。在计算机发展…

docker 安装 redis 详解

在平常的开发工作中&#xff0c;我们经常会用到 redis&#xff0c;那么 docker 下应该如何安装 redis 呢&#xff1f;简单来说&#xff1a;第一步&#xff1a;拉取redis镜像&#xff1b;第二步&#xff1a;设置 redis.conf 配置文件&#xff1b;第三步&#xff1a;编写 docker-…

人工智能之深度学习_[4]-神经网络入门

文章目录 神经网络基础1 神经网络1.1 神经网络概念1.1.1 什么是神经网络1.1.2 如何构建神经网络1.1.3 神经网络内部状态值和激活值 1.2 激活函数1.2.1 网络非线性因素理解1.2.2 常见激活函数1.2.2.1 Sigmoid 激活函数1.2.2.2 Tanh 激活函数1.2.2.3 ReLU 激活函数1.2.2.4 SoftMa…

FPGA中场战事

2023年10月3日,英特尔宣布由桑德拉里维拉(Sandra Rivera)担任“分拆”后独立运营的可编程事业部首席执行官。 从数据中心和人工智能(DCAI)部门总经理,转身为执掌该业务的CEO,对她取得像AMD掌门人苏姿丰博士类似的成功,无疑抱以厚望。 十年前,英特尔花费167亿美元真金白银…

李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕

终端输入nvidia-smi查看cuda版本 我的是12.5&#xff0c;在网上没有找到12.5的torch&#xff0c;就安装12.1的。torch&#xff0c;torchvision&#xff0c;torchaudio版本以及python版本要对应 参考&#xff1a;https://blog.csdn.net/FengHanI/article/details/135116114 创…

Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普

引言&#xff1a; 今天我们聊聊Android生态中最“硬核”的话题&#xff1a;通用内核镜像&#xff08;GKI&#xff09;与内核模块接口&#xff08;KMI&#xff09;。这是内核碎片化终结者的秘密武器&#xff0c;解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…

K8S如何让worker使用kubectl命令(RBAC方法)

背景 目前集群规划如下 kubeadm安装集群master节点默认能使用kubectl命令&#xff0c;worker则不能使用。这是因为worker节点没授权。当然&#xff0c;你可以通过以下方式授权 mkdir .kube scp master1:/root/.kube/config .kube/但这样无疑给了worker节点非常大的权限&#…

【Excel】【VBA】Reaction超限点筛选与散点图可视化

【Excel】【VBA】Reaction超限点筛选与散点图可视化 功能概述 这段代码实现了以下功能&#xff1a; 从SAFE输出的结果worksheet通过datalink获取更新数据从指定工作表中读取数据检测超过阈值的数据点生成结果表格并添加格式化创建可视化散点图显示执行时间 流程图 #mermaid-…

[Computer Vision]实验三:图像拼接

目录 一、实验内容 二、实验过程及结果 2.1 单应性变换 2.2 RANSAC算法 三、实验小结 一、实验内容 理解单应性变换中各种变换的原理&#xff08;自由度&#xff09;&#xff0c;并实现图像平移、旋转、仿射变换等操作&#xff0c;输出对应的单应性矩阵。利用RANSAC算法优…

微信小程序使用picker根据接口给的省市区的数据实现省市区三级联动或者省市区街道等多级联动

接口数据如上图 省市区多级联动&#xff0c;都是使用的一个接口通过传参父类的code。返回我们想要的数据 比如获取省就直接不要参数。市就把省得code传给接口&#xff0c;区就把市的code作为参数。 <picker mode"multiSelector" :range"mulSelect1" …

自动化01

测试用例的万能公式&#xff1a;功能测试界面测试性能测试易用性测试安全性测试兼容性测试 自动化的主要目的就是用来进行回归测试 新产品--第一个版本 (具备丰富的功能)&#xff0c;将产品的整体进行测试&#xff0c;人工创造一个自动化测试用例&#xff0c;在n个版本的时候…

JS宏进阶:正则表达式的使用

正则表达式&#xff0c;对于任何一门编程语言来说&#xff0c;都是一种非常强大的工具&#xff0c;主要用于搜索、编辑或操作文本和数据。因此&#xff0c;在JS中&#xff0c;也存在相应的对象new RegExp( )&#xff0c;在本章中&#xff0c;将详细介绍正则表达式在JS宏中的运用…