练习题(2024/5/8)

1 二叉树的最近公共祖先

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

示例 1:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1
输出:3
解释:节点 5 和节点 1 的最近公共祖先是节点 3 。

示例 2:

输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4
输出:5
解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。

示例 3:

输入:root = [1,2], p = 1, q = 2
输出:1

提示:

  • 树中节点数目在范围 [2, 105] 内。
  • -109 <= Node.val <= 109
  • 所有 Node.val 互不相同 。
  • p != q
  • p 和 q 均存在于给定的二叉树中。

思路:

首先,我们判断根节点是否为空,或者是否等于其中一个节点p或q,如果是的话直接返回根节点。接着,我们分别在左子树和右子树中递归地寻找两个节点的最近公共祖先。如果左子树中找不到公共祖先,则返回右子树中的结果;如果右子树中找不到公共祖先,则返回左子树中的结果。最后,如果左右子树均有公共祖先,则返回根节点作为最近公共祖先。

代码:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {// 如果根节点为空或者根节点等于p或q,则返回根节点if(root == nullptr || root == p || root == q) return root;// 递归地在左子树中查找p和q的公共祖先TreeNode *left = lowestCommonAncestor(root->left, p, q);// 递归地在右子树中查找p和q的公共祖先TreeNode *right = lowestCommonAncestor(root->right, p, q);// 如果左子树中无公共祖先,则返回右子树中的结果if(left == nullptr) return right;// 如果右子树中无公共祖先,则返回左子树中的结果if(right == nullptr) return left;// 如果左右子树均有公共祖先,则返回根节点return root;}
};

2 二叉搜索树中的插入操作

给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同。

注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜索树即可。 你可以返回 任意有效的结果 。

示例 1:

输入:root = [4,2,7,1,3], val = 5
输出:[4,2,7,1,3,5]
解释:另一个满足题目要求可以通过的树是:

示例 2:

输入:root = [40,20,60,10,30,50,70], val = 25
输出:[40,20,60,10,30,50,70,null,null,25]

示例 3:

输入:root = [4,2,7,1,3,null,null,null,null,null,null], val = 5
输出:[4,2,7,1,3,5]

提示:

  • 树中的节点数将在 [0, 104]的范围内。
  • -108 <= Node.val <= 108
  • 所有值 Node.val 是 独一无二 的。
  • -108 <= val <= 108
  • 保证 val 在原始BST中不存在。

思路:

这道题是要将一个值为val的节点插入到二叉搜索树中。首先判断根节点是否为空,如果为空,则创建一个值为val的新节点作为根节点。然后,根据插入值val与当前节点值的大小关系,递归地将值插入到左子树或右子树中。

通常可以按照以下三个步骤进行:

  1. 确定递归函数的参数和返回值: 首先确定递归函数的参数,一般包括当前节点以及需要传递的其他信息,返回值通常是递归函数需要计算或返回的结果。

  2. 确定递归的终止条件: 确定递归函数何时应该停止递归,即递归的终止条件。在这个问题中,终止条件是当当前节点为空时,说明已经遍历到叶子节点的子节点,应该返回插入的新节点。

  3. 确定单层递归的逻辑: 确定每一层递归应该做什么操作。在这个问题中,我们根据插入值与当前节点值的大小关系,决定是将值插入到左子树还是右子树中,然后继续递归调用。

代码:

class Solution {
public:// 将值为val的节点插入二叉搜索树中TreeNode* insertIntoBST(TreeNode* root, int val) {// 如果根节点为空,则创建一个值为val的新节点作为根节点if(root==nullptr){TreeNode* node=new TreeNode(val);return node;}// 如果插入值小于当前节点的值,则递归地插入到左子树中if (root->val>val) root->left=insertIntoBST(root->left,val);// 如果插入值大于当前节点的值,则递归地插入到右子树中if(root->val<val) root->right=insertIntoBST(root->right,val);// 返回根节点return root;}
};

3二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

例如,给定如下二叉搜索树:  root = [6,2,8,0,4,7,9,null,null,3,5]

示例 1:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8
输出: 6 
解释: 节点 2 和节点 8 的最近公共祖先是 6。

示例 2:

输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 4
输出: 2
解释: 节点 2 和节点 4 的最近公共祖先是 2, 因为根据定义最近公共祖先节点可以为节点本身。

说明:

  • 所有节点的值都是唯一的。
  • p、q 为不同节点且均存在于给定的二叉搜索树中。

思路:

本题是二叉搜索树,二叉搜索树是有序的,那得好好利用一下这个特点。

在有序树里,如果判断一个节点的左子树里有p,右子树里有q呢?

因为是有序树,所以 如果 中间节点是 q 和 p 的公共祖先,那么 中节点的数组 一定是在 [p, q]区间的。即 中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。

那么只要从上到下去遍历,遇到 cur节点是数值在[p, q]区间中则一定可以说明该节点cur就是p 和 q的公共祖先。

  1. 递归函数设计:

    • 定义了一个私有的递归函数traversal,参数包括当前节点 cur、需要寻找的两个节点 p 和 q
    • 返回值是当前子树中的最近公共祖先节点。
  2. 终止条件:

    • 如果当前节点为空,直接返回NULL,表示当前子树中不存在最近公共祖先。
  3. 单层递归逻辑:

    • 如果当前节点的值同时大于 p 和 q 的值,则说明 p 和 q 都在当前节点的左子树中,因此递归遍历左子树。
    • 如果当前节点的值同时小于 p 和 q 的值,则说明 p 和 q 都在当前节点的右子树中,因此递归遍历右子树。
    • 如果以上两个条件都不满足,则当前节点即为最近公共祖先节点,直接返回当前节点。
  4. 最终结果:

    • lowestCommonAncestor函数中调用traversal函数,并返回其结果,即为最近公共祖先节点。

代码:

class Solution {
private:// 递归遍历函数,寻找最近公共祖先节点TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q){if(cur == NULL) return NULL;// 如果当前节点的值大于p和q节点的值,则递归遍历左子树if(cur ->val > p->val && cur->val > q->val){TreeNode* left= traversal(cur->left, p, q);if(cur != NULL){return left;}}// 如果当前节点的值小于p和q节点的值,则递归遍历右子树if(cur ->val < p->val && cur->val < q->val){TreeNode* right= traversal(cur->right, p, q);if(cur != NULL){return right;}}return cur; // 返回当前节点作为公共祖先}
public:// 寻找p和q的最近公共祖先节点TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return traversal(root, p, q);}
};

4患某种疾病的患者

患者信息表: Patients

+--------------+---------+
| Column Name  | Type    |
+--------------+---------+
| patient_id   | int     |
| patient_name | varchar |
| conditions   | varchar |
+--------------+---------+
在 SQL 中,patient_id (患者 ID)是该表的主键。
'conditions' (疾病)包含 0 个或以上的疾病代码,以空格分隔。
这个表包含医院中患者的信息。

查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1 。

按 任意顺序 返回结果表。

查询结果格式如下示例所示。

示例 1:

输入:
Patients表:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 1          | Daniel       | YFEV COUGH   |
| 2          | Alice        |              |
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 |
| 5          | Alain        | DIAB201      |
+------------+--------------+--------------+
输出:
+------------+--------------+--------------+
| patient_id | patient_name | conditions   |
+------------+--------------+--------------+
| 3          | Bob          | DIAB100 MYOP |
| 4          | George       | ACNE DIAB100 | 
+------------+--------------+--------------+
解释:Bob 和 George 都患有代码以 DIAB1 开头的疾病。

思路:

常见的SQL正则表达式匹配包括使用 REGEXP 或 RLIKE 关键字,它们用于在 WHERE 子句中对文本列进行正则表达式匹配。具体来说:

  • REGEXP 或 RLIKE:用于指定正则表达式模式进行匹配。
  • 正则表达式模式:定义了要匹配的字符串模式,可以包含特殊字符和通配符,如.*+等。
  • 匹配操作符:常见的匹配操作符包括 ^(表示字符串开头)、$(表示字符串结尾)、[](字符类,表示匹配其中的任何一个字符)、{}(限定符,表示匹配特定数量的前一个元素)等。
  1. 查询目标:

    • 使用 select关键字选择需要查询的列,包括患者ID (patient_id)、患者姓名 (patient_name) 和病况信息 (conditions)。
  2. 条件过滤:

    • 使用 where子句对查询结果进行条件过滤,只选择符合条件的记录。
    • conditions 列使用正则表达式进行匹配,\\bDIAB1.* 表示以"DIAB1"开头的任意字符序列。这样可以确保只选择病况信息以"DIAB1"开头的患者记录。
  3. 查询结果:

    • 执行查询后,返回符合条件的患者ID、患者姓名和病况信息的记录集合。

代码:

select  patient_id, patient_name,conditions   
from Patients
where  conditions   regexp '\\bDIAB1.*';

5 进店却未进行过交易的顾客

SQL Schema


Pandas Schema


表:Visits

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| visit_id    | int     |
| customer_id | int     |
+-------------+---------+
visit_id 是该表中具有唯一值的列。
该表包含有关光临过购物中心的顾客的信息。

表:Transactions

+----------------+---------+
| Column Name    | Type    |
+----------------+---------+
| transaction_id | int     |
| visit_id       | int     |
| amount         | int     |
+----------------+---------+
transaction_id 是该表中具有唯一值的列。
此表包含 visit_id 期间进行的交易的信息。

有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个解决方案,来查找这些顾客的 ID ,以及他们只光顾不交易的次数。

返回以 任何顺序 排序的结果表。

返回结果格式如下例所示。

示例 1:

输入:
Visits
+----------+-------------+
| visit_id | customer_id |
+----------+-------------+
| 1        | 23          |
| 2        | 9           |
| 4        | 30          |
| 5        | 54          |
| 6        | 96          |
| 7        | 54          |
| 8        | 54          |
+----------+-------------+
Transactions
+----------------+----------+--------+
| transaction_id | visit_id | amount |
+----------------+----------+--------+
| 2              | 5        | 310    |
| 3              | 5        | 300    |
| 9              | 5        | 200    |
| 12             | 1        | 910    |
| 13             | 2        | 970    |
+----------------+----------+--------+
输出:
+-------------+----------------+
| customer_id | count_no_trans |
+-------------+----------------+
| 54          | 2              |
| 30          | 1              |
| 96          | 1              |
+-------------+----------------+
解释:
ID = 23 的顾客曾经逛过一次购物中心,并在 ID = 12 的访问期间进行了一笔交易。
ID = 9 的顾客曾经逛过一次购物中心,并在 ID = 13 的访问期间进行了一笔交易。
ID = 30 的顾客曾经去过购物中心,并且没有进行任何交易。
ID = 54 的顾客三度造访了购物中心。在 2 次访问中,他们没有进行任何交易,在 1 次访问中,他们进行了 3 次交易。
ID = 96 的顾客曾经去过购物中心,并且没有进行任何交易。
如我们所见,ID 为 30 和 96 的顾客一次没有进行任何交易就去了购物中心。顾客 54 也两次访问了购物中心并且没有进行任何交易。

思路:

  1. 连接表格: 首先,使用 left join 将 Visits 表和 Transactions 表连接起来。这种连接会包括左边表中的所有行,即使右边表中没有匹配的行也会被包括进来。连接条件是 Visits.visit_id = Transactions.visit_id,这意味着我们正在将这两个表关联到它们共同的访问ID上。

  2. 筛选条件: 在连接后的结果上,使用 WHERE 子句来筛选出那些没有对应交易记录的行。这通过条件 transaction_id is null 完成,它会过滤掉在 Transactions 表中没有对应交易ID的记录,即表示没有交易记录的情况。

  3. 分组统计: 接着,使用 group by 子句按照顾客ID (customer_id) 进行分组。这意味着所有具有相同顾客ID的行将被归为同一组。

  4. 计数: 在每个分组上,使用 count() 函数来计算每个顾客ID出现的次数。这个计数会给出每个顾客ID对应的无交易记录的访问数量。

  5. 结果显示: 最后,将结果显示为两列:顾客ID (customer_id) 和对应的无交易记录的访问数量 (count_no_trans)。

代码:

select customer_id, count(customer_id) as count_no_trans
from Visits 
left join Transactions
on Visits.visit_id = Transactions.visit_id
where transaction_id is null
group by customer_id;

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

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

相关文章

Spring后端参数校验——自定义校验方式(validation)

文章目录 开发场景技术名词解释——Spring Validation自定义校验 技术细节小结1.实体参数校验2.自定义校验 完整代码 开发场景 业务场景&#xff1a;新增文章 基本信息 请求路径&#xff1a;/article 请求方式&#xff1a;POST 接口描述&#xff1a;该接口用于新增文章(发布文…

解决:mybatisplus分页查询失效,总是查询到所有数据

目录 问题描述&#xff1a;解决方案&#xff1a;1.配置mybatisplus拦截器PaginationInterceptor2.自行编写SQL语句查询 问题描述&#xff1a; 在前端使用Map<String, Object> params&#xff0c;把page&#xff0c;limit参数作为请求体传送到后端&#xff0c;但是分页查…

Baidu Comate智能编码助手 -----AI编程帮你解放双手

目录 Baidu Comate是什么&#xff1f; Baidu Comate如何安装&#xff1f; 在VSCode上安装Baidu Comate插件 Baidu Comate如何使用&#xff0c;有哪些功能&#xff1f; 1.代码解释 2.代码注释 使用感受 如何体验 Baidu Comate是什么&#xff1f; Baidu Comate智能编码助手…

DSP28335开发教程--CCS问题02:Tnteger conversion resulted in truncation

出现黄色警告&#xff0c; 如何解决&#xff1a; 当你看到“integer conversion resulted in truncation”这样的错误或警告时&#xff0c;它通常意味着在数据转换过程中有数据丢失。具体来说&#xff0c;就是将一个较大的数值&#xff08;可能是浮点数、长整型等&#xff09;…

PHPStudy 下载PHP提示“当前网络不稳定,下载失败”

错误信息 当前网络不稳定&#xff0c;下载失败 获取下载链接失败&#xff0c;请检查网络 假查网络 问题原因 xp.cn服务器的网络不稳定&#xff0c;不是你电脑的网络问题。 解决办法 第一步&#xff1a;下载现成的PHP文件 直接下载现成的文件&#xff0c;放到php目录。 将…

Java17 --- SpringCloud之Gateway

目录 一、Gateway网关创建 1.1、创建微服务子工程9527及配置和依赖 1.1.1、pom依赖 1.1.2、yml配置 1.1.3、主启动类并测试入驻consul 二、实现路由映射 2.1、服务8001新增测试代码 2.2、修改9527服务yml配置文件 2.3、远程调用接口加gateway 2.3.1、新增80服务测…

DEV--C++小游戏(吃星星(0.2))

目录 吃星星&#xff08;0.2&#xff09; 简介 分部代码 头文件&#xff08;增&#xff09; 命名空间变量&#xff08;增&#xff09; 副函数&#xff08;新&#xff0c;增&#xff09; 清屏函数 打印地图函数&#xff08;增&#xff09; 移动函数 选择颜色&#xff…

用HAL库改写江科大的stm32入门例子_9-2 利用中断进行串口通讯

电路和 《用HAL库改写江科大的stm32入门例子_9-1》一致。 我们在whlie循环当中&#xff0c;不断查询端口&#xff0c;获取数据&#xff0c;存放到一个数组当中,同时回显给电脑上。这种方法耗费cpu,还是用中断进行串口通讯更合理。 基本操作看到一遍写得比较清晰的博客&#x…

python-oracledb 已率先支持 Oracle 23ai

python-oracledb 介绍 python-oracledb (以下简称 oracledb) 是 Python cx_Oracle 驱动程序的新名称&#xff0c;如果你仍在使用 cx_Oracle&#xff0c;建议升级到最新版本的 oracledb。 oracledb 驱动程序是一个开源模块&#xff0c;使 Python 程序能够访问 Oracle 数据库。默…

PyQt5的基本安装与使用

文章目录 1. 简介2.安装2.1.QtDisigner配置2.2 PyUIC配置2.3. PyRCC配置 3. 一个简单的PyQt5使用示例 1. 简介 PyQt5是一个用于创建交互式界面的Python库&#xff0c;它是基于Qt框架的Python绑定。Qt是一个跨平台的C框架&#xff0c;用于开发图形用户界面&#xff08;GUI&…

scala速通(精简版)

1.变量和常量 var name [:VariableType] value // variable val name [:ConstantType] value // constant1.声明变量时&#xff0c;类型可以省略 2.类型定义后就不能修改言 3.变量声明必须有初始值 4.变量&#xff0c;常量分别用var&#xff0c;val声明修饰 2.标识符命名…

识货小程序逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872&#xff0c;x30184483x…

仓库管理系统需求调研要点

仓库管理系统需求调研 一、仓库的作用 仓库分类 原材料仓库&#xff1a;用于存放生产所需的原材料和零部件&#xff0c;需要保持原材料的质量和数量稳定。半成品仓库&#xff1a;存放生产过程中的半成品和在制品&#xff0c;需要保持良好的生产流程和及时出库。成品仓库&#x…

05-08 周三 FastBuild FastAPI 引入并发支持和全局捕获异常

时间版本修改人描述2024年5月8日20:41:03V0.1宋全恒新建文档 简介 由于FastBuild之前花费了大概5天的时间优化&#xff0c;但最近重新部署&#xff0c;又发现了一些问题&#xff0c;就很痛苦&#xff0c;五一之后&#xff0c;自己又花了三天的时间系统的进行了优化。 上一波优…

【R语言】生存分析模型

生存分析模型是用于研究时间至某个事件发生的概率的统计模型。这个事件可以是死亡、疾病复发、治疗失败等。生存分析模型旨在解决在研究时间相关数据时的挑战&#xff0c;例如右侧截尾&#xff08;右侧截尾表示未观察到的事件发生&#xff0c;例如研究结束时还未发生事件&#…

2024年第七届人工智能和模式识别国际会议(AIPR 2024)即将召开!

2024年第七届人工智能和模式识别国际会议&#xff08;AIPR 2024)将于2024年9月20-22日在福建厦门市的华侨大学举行。探索AI边界&#xff0c;解锁识别新境界&#xff01;AIPR 2024旨在促进模式识别与机器学习, 计算机视觉与机器人视觉, 图像、语音、信号和视频处理等领域尖端成果…

星辰考古:TiDB v1.0 再回首

“ 1.0 版本只是个开始&#xff0c;是新的起点&#xff0c;愿我们一路相扶&#xff0c;不负远途。 前言 TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库。 近日&#xff0c;TiDB v8.0.0 DMR 发布&#xff0c;详细发版说明戳这里&#xff1a; https://docs.pingca…

Java | Spring框架 | @Autowired与@Resource

在Spring框架中&#xff0c;依赖注入是一种核心概念&#xff0c;它允许开发者将对象的创建和对象之间的依赖关系的管理交给框架来处理。这样做的目的是为了提高代码的模块化和可测试性。 Spring提供了多种方式来实现依赖注入&#xff0c;其中最常用的方式是通过注解。在本文中…

uniapp + vue3 设置 axios proxy 代理,并重写路径

uniapp vue2 设置代理如下&#xff1a; 已生成的项目架构里面找到manifest.json文件&#xff0c;通过源码视图的方式打开文件&#xff0c;在文件中添加一下代码即可完成代理&#xff1a; "h5": {"devServer": {"disableHostCheck": true, //禁…

linux部署java1.8(jdk1.8)

两种方式&#xff1a; 方式一 1.输入查找命令&#xff1a; yum -y list java*2.输入安装命令&#xff1a; yum install -y java-1.8.0-openjdk.x86_643.测试是否已经安装&#xff1a; java -version方式二&#xff1a; 点击链接进入官网&#xff1a;https://www.oracle.com/…