Java复习第四天

一、代码题

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 + " ");
    }

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

全面了解 Web3 AIGC 和 AI Agent 的创新先锋 MelodAI

不管是在传统领域还是 Crypto&#xff0c;AI 都是公认的最有前景的赛道。随着数字内容需求的爆炸式增长和技术的快速迭代&#xff0c;Web3 AIGC&#xff08;AI生成内容&#xff09;和 AI Agent&#xff08;人工智能代理&#xff09;正成为两大关键赛道。 AIGC 通过 AI 技术生成…

新能源汽车充电桩选型以及安装应用

摘要:随着当前经济的不断发展,国家的科技也有了飞速的进步,传统的燃油汽车已经不能适应当前社会的发展,不仅对能源造成巨大的消耗,还对环境造成了污染,当前一种新型的交通运输工具正在占领汽车市场。在环境问题和能源问题愈发严重的当今社会,节能减排已经成为全世界的共同课题,…

一个vue项目npm install失败的问题解决方案

vue的项目一直是史上最难的最烦的问题&#xff0c;今天给别人做毕设单子想在gitee上拉项目二开的时候&#xff0c;由于很久没写过vue项目已经生疏了&#xff0c;在拿到项目之后我还是例行完成最常见的步骤&#xff1a; 1、npm init -y 初始化 2、npm install 用npm把这个项目…

计算机网络 (55)流失存储音频/视频

一、定义与特点 定义&#xff1a;流式存储音频/视频是指经过压缩并存储在服务器上的多媒体文件&#xff0c;客户端可以通过互联网边下载边播放这些文件&#xff0c;也称为音频/视频点播。 特点&#xff1a; 边下载边播放&#xff1a;用户无需等待整个文件下载完成即可开始播放…

UE求职Demo开发日志#6 测试用强化页面UI搭建

1 反向实现思路设计 先看最终效果&#xff1a; 先做了一个大致的分区&#xff0c;右侧的上半部分用来显示数据&#xff0c;下半部分用来强化和显示需要的材料&#xff0c;至于这个背景设定上强化应该叫什么&#xff0c;。。。。&#xff0c;还没定&#xff0c;反正应该不叫强…

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言 前序已经学习了直接在画布上使用掩模&#xff0c;会获得彩色图像的多种叠加效果&#xff0c;相关文章链接为&#xff1a; python学opencv|读取图像&#xff08;四十&#xff09;掩模&#xff1a;三通道图像的局部覆盖-CSDN博客 这时候如果更进一步&#xff0c;直接…

SpringCloudAlibaba 服务保护 Sentinel 项目集成实践

目录 一、简介1.1、服务保护的基本概念1.1.1、服务限流/熔断1.1.2、服务降级1.1.3、服务的雪崩效应1.1.4、服务的隔离的机制 1.2、Sentinel的主要特性1.3、Sentinel整体架构1.4、Sentinel 与 Hystrix 对比 二、Sentinel控制台部署3.1、版本选择和适配3.2、本文使用各组件版本3.…

窥探QCC518x-308x系列与手机之间的蓝牙HCI记录与分析 - 耳机篇

上一篇是介绍如何窥探手机端Bluetooth的HCI log, 本次介绍是如何窥探Bluetooth的HCI log-耳机篇. 这次跟QCC518x/QCC308x测试的手机是Samsung S23 Ultra. QCC518x/QCC308x透过HCI界面取得Log教学. 步骤1: 开启QMDE -> 选择ADK r1102 QCC3083 Headset workspace.步骤2: 点…

C++ list 容器用法

C list 容器用法 C 标准库提供了丰富的功能&#xff0c;其中 <list> 是一个非常重要的容器类&#xff0c;用于存储元素集合&#xff0c;支持双向迭代器。<list> 是 C 标准模板库&#xff08;STL&#xff09;中的一个序列容器&#xff0c;它允许在容器的任意位置快速…

SpringSecurity实现自定义用户认证方案

Spring Security 实现自定义用户认证方案可以根据具体需求和业务场景进行设计和实施&#xff0c;满足不同的安全需求和业务需求。这种灵活性使得认证机制能够更好地适应各种复杂的环境和变化‌。通过自定义认证方案&#xff0c;可以更好地控制和管理用户的访问权限&#xff0c;…

深入内核讲明白Android Binder【三】

深入内核讲明白Android Binder【三】 前言一、服务的获取过程内核源码解析1. 客户端获取服务的用户态源码回顾2. 客户端获取服务的内核源码分析2.1 客户端向service_manager发送数据1. binder_ioctl2. binder_ioctl_write_read3. binder_thread_write4. binder_transaction4.1 …

深入解析:Docker 容器如何实现文件系统与资源的多维隔离?

目录 一、RootFs1. Docker 镜像与文件系统层2. RootFs 与容器隔离的意义 二、Linux Namespace1. 进程命名空间1.1 lsns 命令说明1.2 查看“祖先进程”命名空间1.3 查看当前用户进程命名空间 2. 容器进程命名空间2.1 查看容器进程命名空间列表2.2 容器进程命名空间的具体体现 三…

解锁Java中的国密算法:安全保障的密钥

一、引言 在数字化浪潮席卷全球的当下&#xff0c;信息安全已然成为国家、企业乃至个人无法忽视的重要议题。国密算法&#xff0c;作为我国自主研发的密码算法体系&#xff0c;宛如坚固的盾牌&#xff0c;为国家信息安全筑起了一道坚不可摧的防线。它的诞生&#xff0c;不仅承载…

proxysql读写分离的部署

关闭防火墙和selinux systemctl stop firewalld systemctl disable firewalld setenforce 0设置主机名称 hostnamectl set-hostname zhangyijia-host71.database.com && bash hostnamectl set-hostname zhangyijia-host72.database.com && bash两台主机安装m…

Android各个版本存储权限适配

一、Android6.0-9.0 1、动态权限申请&#xff1a; private static String[] arrPermissions {android.Manifest.permission.READ_EXTERNAL_STORAGE, android.Manifest.permission.WRITE_EXTERNAL_STORAGE,android.Manifest.permission.ACCESS_FINE_LOCATION,android.Manifest.…

【xcode 16.2】升级xcode后mac端flutter版的sentry报错

sentry_flutter 7.11.0 报错 3 errors in SentryCrashMonitor_CPPException with the errors No type named terminate_handler in namespace std (line 60) and No member named set_terminate in namespace std 替换sentry_flutter版本为&#xff1a; 8.3.0 从而保证oc的…

ASP.NET Core 6.0 如何处理丢失的 Startup.cs 文件

介绍 .NET 6.0 已经发布&#xff0c;ASP.NET Core 6.0 也已发布。其中有不少变化让很多人感到困惑。例如&#xff0c;“谁动了我的奶酪”&#xff0c;它在哪里Startup.cs&#xff1f;在这篇文章中&#xff0c;我将深入研究这个问题&#xff0c;看看它移动到了哪里以及其他变化。…

idea plugin插件开发——入门级教程(IntelliJ IDEA Plugin)

手打不易&#xff0c;如果转摘&#xff0c;请注明出处&#xff01; 注明原文&#xff1a;idea plugin插件开发——入门级教程&#xff08;IntelliJ IDEA Plugin&#xff09;-CSDN博客 目录 前言 官方 官方文档 代码示例 开发前必读 Intellij、Gradle、JDK 版本关系 plu…

概率密度函数(PDF)分布函数(CDF)——直方图累积直方图——直方图规定化的数学基础

对于连续型随机变量&#xff0c;分布函数&#xff08;Cumulative Distribution Function, CDF&#xff09;是概率密度函数&#xff08;Probability Density Function, PDF&#xff09;的变上限积分&#xff0c;概率密度函数是分布函数的导函数。 如果我们有一个连续型随机变量…

三分钟简单了解一些HTML的标签和语法_02

1.a标签演示 点击然后跳转 代码加入title 2.图片链接 3.锚点链接 点击就会跳转的当前位置 4.a标签小知识补充 该实例会跳转到顶,锚点链接则会跳转到相应的锚点 5. 结果:直接跳转到该页面的锚点处 6. 在 HTML 中&#xff0c;<tr>标签表示表格中的行&#xff08;TableRow&…