当前位置: 首页 > news >正文

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] 输出:trueTreeNode 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] 输出:falseTreeNode 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] 输出:falseTreeNode 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) {// 示例 1TreeNode 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// 示例 2TreeNode 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 {@Testpublic 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;@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", strain='" + strain + '\'' +'}';}@Overridepublic 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);}@Overridepublic 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();//增强forfor (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 集合框架工具类

@Testpublic void f01() {List<Integer> list = new ArrayList<>();for (int i = 1; i < 11; i++) {list.add(i);}//洗牌Collections.shuffle(list);System.out.println("洗牌的结果为:" + list + " ");}@Testpublic void f02() {List<Integer> list = new ArrayList<>();for (int i = 1; i < 11; i++) {list.add(i);}//洗牌Collections.reverse(list);System.out.println("洗牌反转后的结果为:" + list + " ");}@Testpublic 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 + " ");}

相关文章:

Java复习第四天

一、代码题 1.相同的树 (1)题目 给你两棵二叉树的根节点p和q&#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入:p[1,2,3]&#xff0c;q[1,2,3] 输出:true示例 2: 输…...

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…...

本地Ubuntu轻松部署高效性能监控平台SigNoz与远程使用教程

文章目录 前言1.关于SigNoz2.本地部署SigNoz3.SigNoz简单使用4. 安装内网穿透5.配置SigNoz公网地址6. 配置固定公网地址 前言 本文介绍如何在Ubuntu系统上使用 Docker 快速部署一款强大的应用性能监控工具SigNoz&#xff0c;并结合cpolar内网穿透工具轻松实现异地远程使用。 …...

防火墙的会话并发数、端口数量及其关系‌

‌防火墙的会话并发数、端口数量及其关系‌&#xff1a; ‌会话并发数‌&#xff1a;会话并发数&#xff0c;也称为并发连接数&#xff0c;是指防火墙能够同时处理的点对点连接的最大数目。这个参数直接影响到防火墙在高流量环境下的表现&#xff0c;特别是对于需要处理大量并发…...

随机变量的变量替换——归一化流和直方图规定化的数学基础

变量替换是一种在统计学和数学中广泛应用的技术&#xff0c;它通过定义新的变量来简化问题&#xff0c;使得原本复杂的随机变量变得更加容易分析。 变量替换的公式&#xff0c;用于将一个随机变量 X X X 的概率密度函数 f X f_X fX​ 转换为其经过函数 g g g 变换后的随机变…...

Java春招面试指南前言

在当今竞争激烈的就业市场中&#xff0c;对于即将踏入职场的Java开发者而言&#xff0c;春招是一次宝贵的机会。本博客专栏旨在为大家提供一份全面且实用的Java春招面试指南&#xff0c;助力大家顺利通过面试&#xff0c;开启职业生涯的新篇章。 无论你是初出茅庐的应届生&…...

【技术洞察】2024科技绘卷:浪潮、突破、未来

涌动与突破 2024年&#xff0c;科技的浪潮汹涌澎湃&#xff0c;人工智能、量子计算、脑机接口等前沿技术如同璀璨星辰&#xff0c;方便了大家的日常生活&#xff0c;也照亮了人类未来的道路。这一年&#xff0c;科技的突破与创新不断刷新着人们对未来的想象。那么回顾2024年的科…...

为AI聊天工具添加一个知识系统 之54 为事务处理 设计 基于DDD的一个 AI操作系统 来处理维度

本文要点 要点 Architecture程序 它被设计为一个双面神结构的控制器&#xff0c;它的两侧一侧编译执行另一侧 解释执行&#xff0c;自已则是一个 翻译器--通过提供两个不同取向之间 的 结构映射的显示器&#xff08;带 图形用户接口GUI和命令行接口CLI 两种 接口&#xff09…...

【数据结构】二分查找

&#x1f6a9; WRITE IN FRONT &#x1f6a9; &#x1f50e; 介绍&#xff1a;"謓泽"正在路上朝着"攻城狮"方向"前进四" &#x1f50e;&#x1f3c5; 荣誉&#xff1a;2021|2022年度博客之星物联网与嵌入式开发TOP5|TOP4、2021|2222年获评…...

读书笔记《网络是怎样连接的》

目录 第一章1.1 生成http请求消息输入网址URL解析URLURL中省略文件名的情况http的基本思路生成HTTP请求消息发送请求后收到响应 1.2 向DNS服务器查询Web服务器的IP地址IP地址的基本知识域名和IP地址并用的理由Socket库提供查询IP地址的功能通过解析器向 DNS 服务器发出查询解析…...

Java 设计模式一

Java 设计模式是软件开发中的一类解决方案&#xff0c;旨在解决常见的设计问题&#xff0c;提升代码的可维护性、可复用性和扩展性。它们通常基于一些经验和最佳实践&#xff0c;提供了解决问题的标准化方法。以下是常见的 Java 设计模式及其概述&#xff1a; 1. 创建型模式 (…...

SOME/IP服务接口

本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟&#xff0c;并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理&#xff0c;并结合实际代码展示 SOME/IP 的使用&#xff0c;旨在自我复习并与大家交流。文中引用了一些例图&#xff0c;但由于未能找到原作…...

Java 生成 PDF 文档 如此简单

嘿&#xff0c;朋友&#xff01;在 Java 里实现 PDF 文档生成那可真是个挺有意思的事儿&#xff0c;今儿个就来好好唠唠这个。咱有不少好用的库可以选择&#xff0c;下面就给你详细讲讲其中两个超实用的库&#xff0c;一个是 iText&#xff0c;另一个是 Apache PDFBox。 用 iTe…...

深入探究 YOLOv5:从优势到模型导出全方位解析

一、引言 在计算机视觉领域&#xff0c;目标检测是一项至关重要的任务&#xff0c;它在自动驾驶、安防监控、工业检测等众多领域都有着广泛的应用。而 YOLO&#xff08;You Only Look Once&#xff09;系列作为目标检测算法中的佼佼者&#xff0c;一直备受关注。其中&#xff…...

【PoCL】运行 LLVM 中 pass 优化过程详解

PoCL 项目中调用 LLVM 的 Pass 对编译过程的优化至关重要。本博文以PoCL 开源项目源码为例,详细说明【PoCL】运行 LLVM 中 pass 优化过程 目录 0. 个人简介 && 授权须知1. pocl_llvm_run_pocl_passes 函数作用2. 禁止 “小网格 small grid” 工作组(workGroup)特化的…...

如何将使用unsloth微调的模型部署到ollama?

目录 一、将模型保存为gguf格式 二、下载llama.cpp 三、生成 llama-quantize 可执行文件 四、使用llama-quantize 五、训练模型 六、将模型部署到ollama 一、将模型保存为gguf格式 在你的训练代码 trainer.train() 之后添加&#xff1a; model.save_pretrained_gguf(&q…...

【测试】UI自动化测试

长期更新&#xff0c;建议关注收藏点赞&#xff01; 目录 概论WEB环境搭建Selenium APPAppium 概论 使用工具和代码执行用例。 什么样的项目需要自动化&#xff1f; 需要回归测试、自动化的功能模块需求变更不频繁、项目周期长&#xff08;功能测试时长&#xff1a;UI自动化测…...

SSM开发(二) MyBatis两种SQL配置方式及其对比

目录 一、MyBatis两种SQL配置方式 二、使用XML映射文件配置SQL语句 三、使用注解配置SQL语句 四、两种方式对比 总结 1、注解 2、XML配置 五、MyBatis多数据源的两种配置方式 参考 一、MyBatis两种SQL配置方式 MyBatis 提供了两种方式来配置SQL语句&#xff1a;注解&a…...

【Redis】在ubuntu上安装Redis

文章目录 提权搜索软件包安装修改配置文件ip保护模式配置密码 重新启动服务器使用 redis 自带的客户端来连接服务器 提权 先切换到 root 用户,su 命令切换到 root. 搜索软件包 使用 apt 命令来搜索 redis 相关的软件包 apt search redis 安装 使用 apt 命令安装 redisapt …...

JS-Web API -day06

一、正则表达式 正则表达式测试工具: http://tool.oschina.net/regex 1.1 正则表达式介绍与语法 正则表达式&#xff1a; 正则表达式&#xff08;Regular Expression&#xff09;是用于匹配字符串中字符组合的模式。在 JavaScript中&#xff0c;正则表达式也是对象。通常用来查…...

JS-Web API -day03

一、事件流 1.1 事件流与两个阶段说明 事件流 指的是事件完整执行过程中的流动路径 假设页面有个div标签&#xff0c;当触发事件时&#xff0c;会经历两个阶段&#xff0c;分别是捕获阶段、冒泡阶段 捕获阶段&#xff1a;Document - Element html - Elementbody - Element div…...

进程优先级

基本概念 cpu资源分配的先后顺序&#xff0c;就是指进程的优先权&#xff08;priority&#xff09;。 优先权⾼的进程有优先执⾏权利。配置进程优先权对多任务环境的linux很有⽤&#xff0c;可以改善系统性能&#xff1b;还可以把进程运⾏到指定的CPU上&#xff0c;这样⼀来&…...

c语言(转义字符)

前言&#xff1a; 内容&#xff1a; 然后记一下转义字符 \? 在书写连续多个问号时使用&#xff0c;防止他们被解析成三字母词 \ 用于表示字符常量 \\ 用于表示一个反斜杠&#xff0c;防止他被解析为一个转义序列符 \n 换行 \r …...

easyexcel读取写入excel easyexceldemo

1.新建springboot项目 2.添加pom依赖 <name>excel</name> <description>excelspringboot例子</description><parent> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId&…...

【人工智能数学基础篇】——深入详解矩阵分解:奇异值分解(SVD)与主成分分析(PCA)在数据降维与特征提取中的应用

目录 1. 引言 2. 矩阵分解概述 2.1 矩阵分解的意义 3. 奇异值分解&#xff08;SVD&#xff09; 3.1 定义与数学基础 3.2 SVD 的性质 3.3 SVD 在数据降维中的应用 3.4 示例代码&#xff1a;使用 SVD 进行图像压缩 3.5 结果分析 4. 主成分分析&#xff08;PCA&#xff0…...

ThreeJS示例教程200+【目录】

Three.js 是一个强大的 JavaScript 库,旨在简化在网页上创建和展示3D图形的过程。它基于 WebGL 技术,但提供了比直接使用 WebGL 更易于使用的API,使得开发者无需深入了解 WebGL 的复杂细节就能创建出高质量的3D内容。 由于目前内容还不多,下面的内容暂时做一个占位。 文章目…...

DC-DC稳压电源——实战(基于Ti5450芯片)基础知识篇(1)

一&#xff1a;基础知识-耦合 1&#xff09;去耦电容 &#xff08;1&#xff09;耦合与去耦 耦合&#xff1a;系统内部的各个部分之间存在相互依赖、相互影响、相互制约的情况。用人话说就是不同部分之间的相互影响。 去耦&#xff1a;自然就是消除不同部分之间的影响了。 &…...

pyrender 渲染mesh

目录 render_meshes函数 调用函数 render_meshes函数 def overlay_human_meshes(humans, K, model, img_pil, unique_colorFalse):# Color of humans seen in the image._color [color[0] for _ in range(len(humans))] if unique_color else color# Get focal and princpt …...

防火墙安全策略

目录 一.拓扑信息 二.需求分析 三.命令行详细配置信息 1.配置IP 2.交换机配置 3.修改安全区域 4.安全策略 四.web界面详细配置 1.配置IP和设置安全区域 2.交换机配置 3.安全策略 五.测试 一.拓扑信息 二.需求分析 1.VLAN 2属于办公区域&#xff1b;VLAN 3属于生…...

selenium clear()方法清除文本框内容

在使用Selenium进行Web自动化测试时&#xff0c;清除文本框内容是一个常见的需求。这可以通过多种方式实现&#xff0c;取决于你使用的是哪种编程语言&#xff08;如Python、Java等&#xff09;以及你的具体需求。以下是一些常见的方法&#xff1a; 1. 使用clear()方法 clear…...