练习题(2024/5/1)

1二叉树的层平均值

简单

相关标签

相关企业

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

示例 1:

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

示例 2:

输入:root = [3,9,20,15,7]
输出:[3.00000,14.50000,11.00000]

提示:

  • 树中节点数量在 [1, 104] 范围内
  • -231 <= Node.val <= 231 - 1

思路:

要求计算二叉树每一层节点值的平均值,并将结果存放在一个数组中返回。解题思路是使用队列来实现层次遍历,通过循环遍历每一层节点,计算该层节点值的和并求平均值,然后将平均值存放在结果集中。具体步骤如下:

  1. 创建一个队列que,用于存放二叉树节点。
  2. 如果根节点不为空,则将根节点加入队列que中。
  3. 创建一个vector<double> result,用于存放每一层平均值。
  4. 循环直到队列que为空:
    a. 获取当前层的节点个数,记为size。
    b. 创建一个变量sum,用于统计当前层节点值的和。
    c. 遍历当前层的每一个节点:
    • 获取队列que中的第一个节点node。
    • 弹出队列que中的第一个节点。
    • 将节点值累加到sum中。
    • 如果节点的左子节点不为空,则将左子节点加入队列que中。
    • 如果节点的右子节点不为空,则将右子节点加入队列que中。
      d. 将当前层节点值的平均值(sum / size)存放在结果集result中。
  5. 返回结果集result。

代码:

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        queue<TreeNode*> que; // 创建一个队列用于存放节点
        if (root != NULL) que.push(root); // 如果根节点不为空,则将根节点加入队列中
        vector<double> result; // 创建一个存放每一层平均值的结果集
        while (!que.empty()) { // 循环直到队列为空
            int size = que.size(); // 获取当前层的节点个数
            double sum = 0; // 统计每一层的和
            for (int i = 0; i < size; i++) {
                TreeNode* node = que.front(); // 获取队列中的第一个节点
                que.pop(); // 弹出队列中的第一个节点
                sum += node->val; // 将节点值累加到sum中
                if (node->left) que.push(node->left); // 如果左子节点不为空,则加入队列中
                if (node->right) que.push(node->right); // 如果右子节点不为空,则加入队列中
            }
            result.push_back(sum / size); // 将每一层均值放进结果集
        }
        return result; // 返回结果集
    }
};

2N 叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

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

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 树的高度不会超过 1000
  • 树的节点总数在 [0, 10^4] 之间

思路:

这道题目是要求对多叉树进行层次遍历,并将每一层节点值存放在一个二维数组中返回。解题思路仍然是使用队列来实现层次遍历,通过循环遍历每一层节点,将节点值存放在对应的向量中,然后将向量存放在结果集中。具体步骤如下:

  1. 创建一个队列que,用于存放多叉树节点。
  2. 如果根节点不为空,则将根节点加入队列que中。
  3. 创建一个vector<vector<int>> result,用于存放每一层节点值的结果集。
  4. 循环直到队列que为空:
    a. 获取当前层的节点个数,记为size。
    b. 创建一个向量vec,用于存放当前层节点值。
    c. 遍历当前层的每一个节点:
    • 获取队列que中的第一个节点node。
    • 弹出队列que中的第一个节点。
    • 将节点值加入向量vec中。
    • 遍历节点的子节点,如果子节点不为空则加入队列que中。
      d. 将当前层节点值的向量vec存放在结果集result中。
  5. 返回结果集result。

代码:

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node*> que; // 创建一个队列用于存放节点
        if(root !=nullptr)  que.push(root); // 如果根节点不为空,则将根节点加入队列中
        vector<vector<int>> result; // 创建一个存放每一层节点值的结果集
        while(!que.empty()){ // 循环直到队列为空
            int size = que.size(); // 获取当前层的节点个数
            vector<int> vec; // 创建一个向量用于存放当前层节点值
            for(int i=0; i<size; i++){
                Node* node = que.front(); // 获取队列中的第一个节点
                que.pop(); // 弹出队列中的第一个节点
                vec.push_back(node->val); // 将节点值加入向量vec中
                for(int i=0; i<node->children.size(); i++){
                    if(node->children[i]) que.push(node->children[i]); // 将子节点加入队列中
                }
            }
            result.push_back(vec); // 将当前层节点值的向量存入结果集中
        }
        return result; // 返回结果集
    }
};

3在每个树行中找最大值

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例1:

输入: root = [1,3,2,5,3,null,9]
输出: [1,3,9]

示例2:

输入: root = [1,2,3]
输出: [1,3]

提示:

  • 二叉树的节点个数的范围是 [0,104]
  • -231 <= Node.val <= 231 - 1

思路:

这道题的重点是通过层次遍历多叉树的节点,记录每一层的最大节点值,并将这些最大节点值存放在一个数组中返回。通过使用队列实现层次遍历,可以有效地处理每一层的节点,并找出最大值。同时,需要注意处理节点为空的情况,避免出现空指针异常。

创建一个队列que,用于存放多叉树节点。
如果根节点不为空,则将根节点加入队列que中。
创建一个vector<vector<int>> result,用于存放每一层节点值的结果集。
循环直到队列que为空:
a. 获取当前层的节点个数,记为size。
b. 初始化当前层的最大值为最小整数值。
c. 遍历当前层的每一个节点:
获取队列que中的第一个节点node。
弹出队列que中的第一个节点。
更新当前层的最大值。
遍历节点的子节点,如果子节点不为空则加入队列que中。
d. 将当前层的最大值存放在结果集result中。
返回结果集result。

代码:

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        queue<TreeNode*> que; // 创建一个队列用于存放节点
        if(root !=nullptr) que.push(root); // 如果根节点不为空,则将根节点加入队列中
        vector<int> result; // 创建一个存放每层最大值的结果集
        while(!que.empty()){ // 循环直到队列为空
            int size = que.size(); // 获取当前层的节点个数
            int maxvalue = INT_MIN; // 初始化最大值为最小整数值
            for(int i=0; i<size; i++){
                TreeNode* node = que.front(); // 获取队列中的第一个节点
                que.pop(); // 弹出队列中的第一个节点
                maxvalue = node->val > maxvalue ? node->val : maxvalue; // 更新最大值
                if(node->left) que.push(node->left); // 将左子节点加入队列中
                if(node->right) que.push(node->right); // 将右子节点加入队列中
            }
            result.push_back(maxvalue); // 将当前层的最大值存入结果集中
        }
        return result; // 返回结果集
    }
};

4电影评分

表:Movies

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| movie_id      | int     |
| title         | varchar |
+---------------+---------+
movie_id 是这个表的主键(具有唯一值的列)。
title 是电影的名字。

表:Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
+---------------+---------+
user_id 是表的主键(具有唯一值的列)。

表:MovieRating

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| movie_id      | int     |
| user_id       | int     |
| rating        | int     |
| created_at    | date    |
+---------------+---------+
(movie_id, user_id) 是这个表的主键(具有唯一值的列的组合)。
这个表包含用户在其评论中对电影的评分 rating 。
created_at 是用户的点评日期。 

请你编写一个解决方案:

  • 查找评论电影数量最多的用户名。如果出现平局,返回字典序较小的用户名。
  • 查找在 February 2020 平均评分最高 的电影名称。如果出现平局,返回字典序较小的电影名称。

字典序 ,即按字母在字典中出现顺序对字符串排序,字典序较小则意味着排序靠前。

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

示例 1:

输入:
Movies 表:
+-------------+--------------+
| movie_id    |  title       |
+-------------+--------------+
| 1           | Avengers     |
| 2           | Frozen 2     |
| 3           | Joker        |
+-------------+--------------+
Users 表:
+-------------+--------------+
| user_id     |  name        |
+-------------+--------------+
| 1           | Daniel       |
| 2           | Monica       |
| 3           | Maria        |
| 4           | James        |
+-------------+--------------+
MovieRating 表:
+-------------+--------------+--------------+-------------+
| movie_id    | user_id      | rating       | created_at  |
+-------------+--------------+--------------+-------------+
| 1           | 1            | 3            | 2020-01-12  |
| 1           | 2            | 4            | 2020-02-11  |
| 1           | 3            | 2            | 2020-02-12  |
| 1           | 4            | 1            | 2020-01-01  |
| 2           | 1            | 5            | 2020-02-17  | 
| 2           | 2            | 2            | 2020-02-01  | 
| 2           | 3            | 2            | 2020-03-01  |
| 3           | 1            | 3            | 2020-02-22  | 
| 3           | 2            | 4            | 2020-02-25  | 
+-------------+--------------+--------------+-------------+
输出:
Result 表:
+--------------+
| results      |
+--------------+
| Daniel       |
| Frozen 2     |
+--------------+
解释:
Daniel 和 Monica 都点评了 3 部电影("Avengers", "Frozen 2" 和 "Joker") 但是 Daniel 字典序比较小。
Frozen 2 和 Joker 在 2 月的评分都是 3.5,但是 Frozen 2 的字典序比较小。

思路:

这个SQL查询的解题思路如下:

1. 首先针对MovieRating表和Users表进行连接查询,通过用户ID将评分记录和用户信息进行关联。
2. 对结果按照用户ID进行分组,然后按照每个用户对电影的评分次数进行降序排列,同时如果评分次数相同的情况下按照用户名称进行升序排列,这样就可以找到评分次数最多的用户。
3. 使用limit 0,1来限制结果集只返回第一条结果,即评分次数最多的用户。
4. 然后使用union  all操作符将上述结果与下面的查询结果进行合并。
5. 对MovieRating表和Movies表进行连接查询,通过电影ID将评分记录和电影信息进行关联。
6. 在where子句中筛选出2020年2月份产生的评分记录。
7. 对结果按照电影ID进行分组,然后按照每部电影的评分平均值进行降序排列,同时如果平均值相同的情况下按照电影标题进行升序排列,这样就可以找到2020年2月份评分平均值最高的电影。
8. 使用limit 0,1来限制结果集只返回第一条结果,即评分平均值最高的电影。

代码:



```sql
-- 获取评分次数最多的用户
(
    select u.name as 结果 -- 选择用户的名称作为结果列
    from MovieRating r join Users u -- 从MovieRating表和Users表中连接查询
    on r.user_id=u.user_id -- 根据用户ID进行连接
    group by r.user_id -- 按用户ID分组
    order by count(r.movie_id) desc, u.name -- 根据电影ID的计数降序排列,若计数相同则按用户名称升序排列
    limit 0,1 -- 只取第一条结果
)
union all
-- 获取2020年2月份评分平均值最高的电影
(
    select m.title as 结果 -- 选择电影的标题作为结果列
    from MovieRating r join Movies m -- 从MovieRating表和Movies表中连接查询
    on r.movie_id=m.movie_id -- 根据电影ID进行连接
    where r.created_at between '2020-02-01' and '2020-02-29' -- 选择创建日期在2020年2月份的评分记录
    group by r.movie_id -- 按电影ID分组
    order by avg(r.rating) desc, m.title -- 根据评分的平均值降序排列,若平均值相同则按电影标题升序排列
    limit 0,1 -- 只取第一条结果
);
```

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

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

相关文章

关于建表、表字段的增删改等的语法及举例(字段类型、字段约束、建表语法、表字段增删改、注意事项等)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

ASUS华硕ROG幻15笔记本GU502GU原装出厂Windows10系统工厂模式安装包下载,带MyASUS WinRE恢复重置功能

华硕ROG Zephyrus M15笔记本原厂Win10预装OEM系统&#xff0c;恢复开箱状态 适用型号&#xff1a;GU502GW&#xff0c;GU502GU&#xff0c;GU502GV 链接&#xff1a;https://pan.baidu.com/s/1lTK_CUFT9N3q0sXBS7ENPg?pwd8hm2 提取码&#xff1a;8hm2 华硕原装W10系统工厂…

警惕虚假宣传:GPT-4.0免费领取真相揭秘

警惕虚假宣传&#xff1a;GPT-4.0免费领取真相揭秘 在人工智能技术飞速发展的今天&#xff0c;尤其是OpenAI推出的GPT-4.0成为技术前沿的焦点&#xff0c;不少不法分子也开始借机进行欺诈。网络上出现了大量声称“免费领取GPT-4.0”的虚假信息&#xff0c;这不仅误导了公众&am…

嵌入式全栈开发学习笔记---C语言知识复习大全1

目录 Linux开发者的基本素养-文件分类 补充命令1-pwd 补充命令2-clear 在Linux上编写C程序 在Linux上编译程序 思考&#xff1a;C语言中一定要main函数吗 我们为什么要学习C语言&#xff1f;学习C语言有助于理解计算机底层工作原理&#xff01; 后面我们的很多项目也都是…

ML.NET机器学

一、新建项目MLL 二、选择方案 我们这里选择的是计算机视觉-->图像分类 三、选择环境 本地(CPU) 四、选择数据 我自己造了2个验证码的目录 五、训练 六、评估 7、代码中使用 运行效果&#xff1a;

MySQL中索引的数据结构

2.3.1. 索引数据结构 索引就是能够提高查询速度的一种数据结构&#xff0c;在数据插入时就进行了排序&#xff08;会影响插入和更新的性能&#xff09;&#xff0c;索引广泛使用的是B树索引。 B树索引结构&#xff1a; 目前是基于磁盘排序效率最高的数据结构&#xff0c;树非…

Linux:浏览器访问网站的基本流程(优先级从先到后)

浏览器访问网站的基本流程&#xff08;优先级从先到后&#xff09; 首先查找浏览器是否存在该网站的访问缓存 其次查找本机的域名解析服务器 windows&#xff1a;C:\Windows\System32\drivers\etc\hostsLinux&#xff1a;/etc/hosts 使用外部的域名解析服务器解析&#xff…

如何安装cuda版本的torch-sparse和torch-scatter

安装对应cuda版本的torch&#xff0c;确保cuda可用 使用nvidia-smi查看cuda版本&#xff0c;我的是11.4&#xff0c;然后就找到pytorch历史版本&#xff0c;页面搜索cuda 11.4&#xff0c;没搜到&#xff0c;继续往小版本搜&#xff0c;搜到cuda 11.3&#xff0c;果断安装&…

【深度学习实战(29)】后处理之NMS(非极大值抑制)

一、NMS工作原理 NMS 的工作原理&#xff1a; 置信度排序&#xff1a;对于每个类别&#xff0c;NMS 首先根据每个边界框的置信度&#xff08;即预测框中含有目标的概率&#xff09;进行排序。选择最高置信度框&#xff1a;从置信度最高的边界框开始&#xff0c;将其作为当前考…

# 从浅入深 学习 SpringCloud 微服务架构(七)Hystrix(2)

从浅入深 学习 SpringCloud 微服务架构&#xff08;七&#xff09;Hystrix&#xff08;2&#xff09; 一、Hystrix&#xff1a;基于 RestTemplate 的统一降级配置 1、Hystrix&#xff1a;基于 RestTemplate 的统一降级配置 步骤&#xff1a; 1&#xff09;在项目的 pom.xml …

前端 CSS

目录 选择器 复合选择器 伪类-超链接 结构伪装选择器 伪元素选择器 画盒子 字体属性 CSS三大属性 Emmet写法 背景属性 显示模式 盒子模型 盒子模型-组成 盒子模型-向外溢出 盒子模型-圆角 盒子模型-阴影 flex position定位 CSS小精灵 字体图标 垂直对齐方式…

《R语言与农业数据统计分析及建模》学习——logistic回归和poisson回归

普通线性回归通常用来描述变量y与x之间的线性关系&#xff1a; 普通线性模型的假设是&#xff1a;响应变量y是连续型变量而且&#xff0c;服从正态分布分布。但在很多现实情况y并不是正态分布&#xff0c;如&#xff1a;二值问题/多分类问题&#xff0c;计次问题等&#xff0c;…

防火墙远程桌面端口号修改,如何用防火箱修改远程桌面的端口号

在网络安全日益重要的今天&#xff0c;修改远程桌面服务的默认端口号已成为提高系统安全性的重要手段。通过修改端口号&#xff0c;可以有效防止潜在的恶意攻击者通过扫描常见端口来发现并利用系统的漏洞。本文将详细介绍如何在Windows系统中修改远程桌面服务的端口号&#xff…

2024 五一杯高校数学建模邀请赛(C题)| 煤矿深部开采冲击地压危险预测 |建模秘籍文章代码思路大全

铛铛&#xff01;小秘籍来咯&#xff01; 小秘籍团队独辟蹊径&#xff0c;构建了这一题的详细解答哦&#xff01; 为大家量身打造创新解决方案。小秘籍团队&#xff0c;始终引领着建模问题求解的风潮。 抓紧小秘籍&#xff0c;我们出发吧~ 让我们看看五一杯的C题&#xff01; 完…

动静态库(完结版)

文章目录 接上篇完成blog第三方库安装演示动态库加载原理一二三四 接上篇完成blog 上篇链接 第三方库安装演示 sudo yum install -y ncurses-devel下载完成之后 在系统目录下面一定能找到对应的头文件和库文件 此时使用第三方库: 编译之后按错误提示是对应的函数找不到,所以链…

C语言 | Leetcode C语言题解之第60题排列序列

题目&#xff1a; 题解&#xff1a; char* getPermutation(int n, int k) {int factorial[n];factorial[0] 1;for (int i 1; i < n; i) {factorial[i] factorial[i - 1] * i;}--k;char* ans malloc(n 1);ans[n] \0;int valid[n 1];for (int i 0; i < n; i) {val…

“云卷数潮”云原生数据库分论坛亮点回顾!

4月29日&#xff0c;2024中国移动算力网络大会“云卷数潮”云原生数据库分论坛在江苏苏州举行。本次论坛不仅是技术交流的盛宴&#xff0c;更是行业发展趋势的风向标。论坛汇聚了众多企业领袖、专家学者及行业精英&#xff0c;共话云原生数据库技术发展&#xff0c;探讨行业最新…

git 配置相关

问题一&#xff1a;ssh-keygen -t ed25519 -C "Gitee SSH Key" 这个命令中的 ed25519 字符是什么意思&#xff1f; ssh-keygen 是一个用于生成SSH密钥的工具&#xff0c;SSH&#xff08;Secure Shell&#xff09;是一种网络协议&#xff0c;用于加密方式远程登录和其…

数据库(MySQL)—— DML语句

数据库&#xff08;MySQL&#xff09;—— DML语句 什么是DML语句添加数据给全部字段添加数据批量添加数据 修改数据删除数据 什么是DML语句 在MySQL中&#xff0c;DML&#xff08;Data Manipulation Language&#xff0c;数据操纵语言&#xff09;语句主要用于对数据库中的数…

http的basic 认证方式

写在前面 本文看下http的basic auth认证方式。 1&#xff1a;什么是basic auth认证 basic auth是一种http协议规范中的一种认证方式&#xff0c;即一种证明你就是你的方式。更进一步的它是一种规范&#xff0c;这种规范是这样子&#xff0c;如果是服务端使用了basic auth认证…