【LeetCode Solutions】LeetCode 176 ~ 180 题解

news2025/5/10 9:13:59

CONTENTS

  • LeetCode 176. 第二高的薪水(SQL 中等)
  • LeetCode 177. 第 N 高的薪水(SQL 中等)
  • LeetCode 178. 分数排名(SQL 中等)
  • LeetCode 179. 最大数(中等)
  • LeetCode 180. 连续出现的数字(SQL 中等)

LeetCode 176. 第二高的薪水(SQL 中等)

【题目描述】

Employee 表:

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是这个表的主键。
表的每一行包含员工的工资信息。

查询并返回 Employee 表中第二高的不同薪水。如果不存在第二高的薪水,查询应该返回 null(Pandas 则返回 None)。

查询结果如下例所示。

【示例 1】

输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+

输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| 200                 |
+---------------------+

【示例 2】

输入:
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+

输出:
+---------------------+
| SecondHighestSalary |
+---------------------+
| null                |
+---------------------+

【分析】

本题有多种解法:

  • 方法一:可以先从 Employee 表中查询 Salary 列,并且使用 DISTINCT 关键字去除重复的工资值。然后使用 ORDER BY Salary DESC 将查询结果按照 Salary 列的值进行降序排列,接着使用 LIMIT 1 OFFSET 1 跳过 1 行,并限制输出结果只有 1 行,也就是只输出第二行。然而,如果没有第二高的薪资,即表里可能只有一条记录,这种情况下查询会返回一个空结果集,而不是 NULL,因此可以使用子查询,如果子查询没有返回任何值,外层的 SELECT 会将结果视为 NULL,因此,整个查询会返回 NULL
  • 方法二:先使用 SELECT MAX(Salary) FROM Employee 查询表中的最大工资值,然后将小于最大工资作为查询条件再查一遍表,然后返回查询结果的最大值就是整个表中第二大的值。

【代码】

【方法一】

# Write your MySQL query statement below
SELECT (
    SELECT DISTINCT Salary
    FROM Employee
    ORDER BY Salary DESC
    LIMIT 1 OFFSET 1
) AS SecondHighestSalary;

【方法二】

# Write your MySQL query statement below
SELECT MAX(Salary) AS SecondHighestSalary
FROM Employee
WHERE Salary < (SELECT MAX(Salary) FROM Employee);

LeetCode 177. 第 N 高的薪水(SQL 中等)

【题目描述】

表:Employee

+-------------+------+
| Column Name | Type |
+-------------+------+
| id          | int  |
| salary      | int  |
+-------------+------+
id 是该表的主键(列中的值互不相同)。
该表的每一行都包含有关员工工资的信息。

编写一个解决方案查询 Employee 表中第 n n n 高的不同工资。如果少于 n n n 个不同工资,查询结果应该为 null

查询结果格式如下所示。

【示例 1】

输入: 
Employee table:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
| 2  | 200    |
| 3  | 300    |
+----+--------+
n = 2

输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| 200                    |
+------------------------+

【示例 2】

输入: 
Employee 表:
+----+--------+
| id | salary |
+----+--------+
| 1  | 100    |
+----+--------+
n = 2

输出: 
+------------------------+
| getNthHighestSalary(2) |
+------------------------+
| null                   |
+------------------------+

【分析】

与上一题类似,直接使用第一种方法将偏移量设置为 n − 1 n - 1 n1 即可,需要注意的是 LIMIT 语句中不能有表达式,要先把 n − 1 n - 1 n1 计算出来。

也可以使用窗口函数(Window Function)DENSE_RANK() 为工资值按降序排列计算排名。DENSE_RANK() 函数为相同值分配相同的排名,并且不会跳过后续的排名。然后使用 WHERE ranking = N 来过滤数据,保留排名等于传入参数 N 的行,该方法也适用于上一题。

OVER 关键字是 SQL 中用于定义窗口函数的作用范围和行为的关键字,它允许你在一个查询中对一组相关行进行计算,而无需像聚合函数那样将它们分组到一个单独的行中。


【代码】

【方法一】

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  DECLARE M INT;
  SET M = N - 1;
  RETURN (
    # Write your MySQL query statement below.
    SELECT (
        SELECT DISTINCT Salary
        FROM Employee
        ORDER BY Salary DESC
        LIMIT 1 OFFSET M
    )
  );
END

【方法二】

CREATE FUNCTION getNthHighestSalary(N INT) RETURNS INT
BEGIN
  RETURN (
    # Write your MySQL query statement below.
    SELECT IF(COUNT(*), RKSalary.Salary, NULL)  # count(*) 计算查询结果的数量,若不为空则返回 Salary 列,否则返回 NULL
    FROM (
        SELECT Salary, DENSE_RANK() OVER(ORDER BY Salary DESC) as RK
        FROM Employee
    ) AS RKSalary  # 子查询生成的派生表必须有一个别名
    WHERE RKSalary.RK = N
  );
END

LeetCode 178. 分数排名(SQL 中等)

【题目描述】

表:Scores

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| score       | decimal |
+-------------+---------+
id 是该表的主键(有不同值的列)。
该表的每一行都包含了一场比赛的分数。score 是一个有两位小数点的浮点值。

编写一个解决方案来查询分数的排名。排名按以下规则计算:

  • 分数应按从高到低排列。
  • 如果两个分数相等,那么两个分数的排名应该相同。
  • 在排名相同的分数后,排名数应该是下一个连续的整数。换句话说,排名之间不应该有空缺的数字。

score 降序返回结果表。

查询结果格式如下所示。

【示例 1】

Scores 表:
+----+-------+
| id | score |
+----+-------+
| 1  | 3.50  |
| 2  | 3.65  |
| 3  | 4.00  |
| 4  | 3.85  |
| 5  | 4.00  |
| 6  | 3.65  |
+----+-------+

输出: 
+-------+------+
| score | rank |
+-------+------+
| 4.00  | 1    |
| 4.00  | 1    |
| 3.85  | 2    |
| 3.65  | 3    |
| 3.65  | 3    |
| 3.50  | 4    |
+-------+------+

【分析】

上一题中用到的窗口函数 DENSE_RANK() 正适合用来解决本题。此外还有另一种思路,每个分数的排名就是表经过去重后大于等于当前分数的数量,例如对于样例中的 3.85,去重后大于当前数的值为 4.00 和 3.85,即当前数的排名为 2。


【代码】

【方法一】

# Write your MySQL query statement below
SELECT score, DENSE_RANK() OVER(ORDER BY score DESC) AS "rank"  # rank 是关键字,因此需要用引号
FROM Scores;

【方法二】

# Write your MySQL query statement below
SELECT S1.score, (
    SELECT COUNT(DISTINCT S2.score)
    FROM Scores S2
    WHERE S2.score >= S1.score
) AS "rank"
FROM Scores S1
ORDER BY S1.score DESC;

LeetCode 179. 最大数(中等)

【题目描述】

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。
注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

【示例 1】

输入:nums = [10,2]
输出:"210"

【示例 2】

输入:nums = [3,30,34,5,9]
输出:"9534330"

【提示】

1 < = n u m s . l e n g t h < = 100 1 <= nums.length <= 100 1<=nums.length<=100
0 < = n u m s [ i ] < = 1 0 9 0 <= nums[i] <= 10^9 0<=nums[i]<=109


【分析】

本题的思路也比较难想,需要定义一种新的比较方式:

  • a = b    ⟺    a b = b a a = b \iff ab = ba a=bab=ba
  • a ≤ b    ⟺    a b ≤ b a a \le b \iff ab \le ba ababba
  • a ≥ b    ⟺    a b ≥ b a a \ge b \iff ab \ge ba ababba

例如我们现在有两个数 123 和 45,由于 12345 < 45123 12345 < 45123 12345<45123,因此 123 < 45 123 < 45 123<45

假设最大的整数表示为: s 1 s 2 s 3 … s n s_1s_2s_3\dots s_n s1s2s3sn,那么说明该排序算法从大到小排序后的结果为: s 1 ≥ s 2 ≥ s 3 ≥ ⋯ ≥ s n s_1 \ge s_2 \ge s_3 \ge \dots \ge s_n s1s2s3sn。若存在 s i < s i + 1 s_i < s_{i + 1} si<si+1 的情况,说明 s i s i + 1 < s i + 1 s i s_is_{i + 1} < s_{i + 1}s_i sisi+1<si+1si,而当前数为最大整数,因此产生了冲突,说明排序算法从大到小排序后的结果一定是最大整数。

到这里还没有完全结束,因为这个比较方式是我们自己定义的,还需要证明这个方式能够正确排序,例如不能出现 a < b a < b a<b b < c b < c b<c c < a c < a c<a 的情况。这是离散数学中的一个概念,一个能够排序的关系被称为全序关系,需要满足以下三个性质:

  • a ≤ b a \le b ab b ≤ a b \le a ba,则 a = b a = b a=b(反对称性);
  • a ≤ b a \le b ab b ≤ c b \le c bc,则 a ≤ c a \le c ac(传递性);
  • a ≤ b a \le b ab b ≤ a b \le a ba(完全性)。

我们证明一下这三个性质:

  • a b ≤ b a ab \le ba abba b a ≤ a b ba \le ab baab,而其中的比较方式为具有全序关系的字典序比较,因此能推出 a b = b a ab = ba ab=ba
  • a b ≤ b a ab \le ba abba b c ≤ c b bc \le cb bccb,假设 a , b , c a, b, c a,b,c 的长度分别为 x , y , z x, y, z x,y,z,因此 a b ab ab 的长度等于 b a ba ba,字典序也就可以转化为普通整数的比较,即 a ∗ 1 0 y + b ≤ b ∗ 1 0 x + a ⇒ a ( 1 0 y − 1 ) ≤ b ( 1 0 x − 1 ) ⇒ a b ≤ ( 1 0 x − 1 ) ( 1 0 y − 1 ) a * 10^y + b \le b * 10^x + a \Rightarrow a(10^y - 1) \le b(10^x - 1) \Rightarrow \frac{a}{b} \le \frac{(10^x - 1)}{(10^y - 1)} a10y+bb10x+aa(10y1)b(10x1)ba(10y1)(10x1),同理 b c ≤ ( 1 0 y − 1 ) ( 1 0 z − 1 ) \frac{b}{c} \le \frac{(10^y - 1)}{(10^z - 1)} cb(10z1)(10y1),将两个不等式的左右两边分别同时相乘可以得到 a c ≤ ( 1 0 x − 1 ) ( 1 0 z − 1 ) \frac{a}{c} \le \frac{(10^x - 1)}{(10^z - 1)} ca(10z1)(10x1),这个式子就表示 a c ≤ c a ac \le ca acca
  • 显然任何的 a b ab ab b a ba ba 之间都能进行字典序比较,满足完全性。

【代码】

class Solution {
public:
    string largestNumber(vector<int>& nums) {
        sort(nums.begin(), nums.end(), [](int a, int b){
            string sa = to_string(a), sb = to_string(b);
            return sa + sb > sb + sa;
        });
        if (nums[0] == 0) return "0";  // 如果全为 0 那么结果只保留一个 0
        string res;
        for (int x: nums) res += to_string(x);
        return res;
    }
};

LeetCode 180. 连续出现的数字(SQL 中等)

【题目描述】

表:Logs

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+
在 SQL 中,id 是该表的主键。
id 是一个自增列。

找出所有至少连续出现三次的数字。

返回的结果表中的数据可以按任意顺序排列。

结果格式如下面的例子所示:

【示例 1】

输入:
Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+

输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

解释:1 是唯一连续出现至少三次的数字。

【分析】

最简单的方式就是直接查询三个 Logs 表,在 WHERE 语句中判断这三行的 id 是否连续且 num 相等。

此外还可以使用窗口函数 ROW_NUMBER() 为每个分区内的行分配唯一的行号,即使用 CAST(ROW_NUMBER() OVER(PARTITION BY num ORDER BY id) AS SIGNED) AS rn 语句将数据按 num 值分区,使得每个 num 值都有自己的计数序列,接着在每个分区内,按 id 值的升序为行分配行号:

+----+-----+           +----+-----+----+
| id | num |           | id | num | rn |
+----+-----+           +----+-----+----+
| 1  | 1   |           | 1  | 1   | 1  |
| 2  | 1   |           | 2  | 1   | 2  |
| 3  | 1   |     =>    | 3  | 1   | 3  |
| 4  | 2   |           | 5  | 1   | 4  |
| 5  | 1   |           | 4  | 2   | 1  |
| 6  | 2   |           | 6  | 2   | 2  |
| 7  | 2   |           | 7  | 2   | 3  |
+----+-----+           +----+-----+----+

CAST(... AS SIGNED)ROW_NUMBER() 的结果转换为有符号整数类型。这是因为 ROW_NUMBER() 返回的是 BIGINT UNSIGNED 类型,而后续的计算需要使用有符号整数。

接下来使用 GROUP BY num, rn - id 语句将查询结果按 num 列以及 rn - id 的计算结果进行分组。目的是识别和组合具有相同 num 值且连续的 id 值的行,因为如果 id 连续,rn - id 的值会相同:

+----+-----+----+---------+
| id | num | rn | rn - id |
+----+-----+----+---------+
| 1  | 1   | 1  |  0      |
| 2  | 1   | 2  |  0      |
| 3  | 1   | 3  |  0      |
| 5  | 1   | 4  | -1      |
| 4  | 2   | 1  | -3      |
| 6  | 2   | 2  | -4      |
| 7  | 2   | 3  | -4      |
+----+-----+----+---------+

最后使用 HAVING COUNT(num) >= 3 语句对 GROUP BY 生成的分组结果进行过滤,只保留满足连续出现至少 3 次相同 num 的组。


【代码】

【方法一】

# Write your MySQL query statement below
SELECT DISTINCT L1.num AS ConsecutiveNums
FROM Logs L1, Logs L2, Logs L3
WHERE L1.id = L2.id - 1 AND L2.id = L3.id - 1 AND L1.num = L2.num AND L2.num = L3.num;

【方法二】

# Write your MySQL query statement below
SELECT DISTINCT num AS ConsecutiveNums
FROM (
    SELECT id, num, CAST(ROW_NUMBER() OVER(PARTITION BY num ORDER BY id) AS SIGNED) AS rn
    FROM Logs
) AS Logs_RN
GROUP BY Logs_RN.num, Logs_RN.rn - Logs_RN.id
HAVING COUNT(num) >= 3;

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

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

相关文章

第十五章,SSL VPN

前言 IPSec 和 SSL 对比 IPSec远程接入场景---client提前安装软件&#xff0c;存在一定的兼容性问题 IPSec协议只能够对感兴趣的流量进行加密保护&#xff0c;意味着接入用户需要不停的调整策略&#xff0c;来适应IPSec隧道 IPSec协议对用户访问权限颗粒度划分的不够详细&…

spring5.x讲解介绍

Spring 5.x 是 Spring Framework 的重要版本升级&#xff0c;全面拥抱现代 Java 技术栈&#xff0c;其核心改进涵盖响应式编程、Java 8支持、性能优化及开发模式创新。以下从特性、架构和应用场景三个维度详细解析&#xff1a; 一、核心特性与架构改进 Java 8 全面支持 Spring …

荣耀A8互动娱乐组件部署实录(第3部分:控制端结构与房间通信协议)

作者&#xff1a;曾在 WebSocket 超时里泡了七天七夜的苦命人 一、控制端总体架构概述 荣耀A8控制端主要承担的是“运营支点”功能&#xff0c;也就是开发与运营之间的桥梁。它既不直接参与玩家行为&#xff0c;又控制着玩家的行为逻辑和游戏规则触发机制。控制端的主要职责包…

levelDB的数据查看(非常详细)

起因:.net大作业天气预报程序(WPF)答辩时&#xff0c;老师问怎么维持数据持久性的&#xff0c;启动时加载的数据存在哪里&#xff0c;我明白老师想考的应该是json文件的解析&#xff08;正反&#xff09;&#xff0c;半天没答上来存那个文件了&#xff08;老师默认这个文件是自…

在Fiddler中添加自定义HTTP方法列并高亮显示

在Fiddler中添加自定义HTTP方法列并高亮显示 Fiddler 是一款强大的 Web 调试代理工具&#xff0c;允许开发者检查和操作 HTTP 流量。一个常见需求是自定义 Web Sessions 列表&#xff0c;添加显示 HTTP 方法&#xff08;GET、POST 等&#xff09;的列&#xff0c;并通过颜色区…

基于公共卫生大数据收集与智能整合AI平台构建测试:从概念到实践

随着医疗健康数据的爆发式增长,如何有效整合、分析和利用这些数据已成为公共卫生领域的重要挑战。传统方法往往难以应对数据的复杂性、多样性和海量性,而人工智能技术的迅猛发展为解决这些挑战提供了新的可能性。基于数据整合与公共卫生大数据的AI平台旨在构建一个全面的生态…

clahe算法基本实现

一、背景介绍 图像算法处理中&#xff0c;经常需要遇到图像对比度调整的情况&#xff0c;CLAHE(Contrast Limited Adaptive Histogram Equalization)则是一种基于直方图&#xff0c;使用非常普遍的图像对比度调整算法。 关于这个算法的介绍有很多&#xff0c;基本原理这些&…

python打卡day20

特征降维------特征组合&#xff08;以SVD为例&#xff09; 知识点回顾&#xff1a; 奇异值的应用&#xff1a; 特征降维&#xff1a;对高维数据减小计算量、可视化数据重构&#xff1a;比如重构信号、重构图像&#xff08;可以实现有损压缩&#xff0c;k 越小压缩率越高&#…

数字化转型-4A架构之数据架构

系列文章 数字化转型-4A架构&#xff08;业务架构、应用架构、数据架构、技术架构&#xff09; 数字化转型-4A架构之业务架构 数字化转型-4A架构之应用架构 数据架构 Data Architecture&#xff08;DA&#xff09; 1. 定义 数据架构&#xff0c;是组织管理数据资产的科学之…

React 第三十七节 Router 中 useOutlet Hook的使用介绍以及注意事项

React Router 中的 useOutlet 是 v6 版本新增的 Hook&#xff0c;用于在父路由组件中访问当前嵌套的子路由元素。它提供了比 <Outlet> 组件更灵活的控制方式&#xff0c;适合需要根据子路由状态进行动态处理的场景。 一、useOutlet的基本用法 import { useOutlet } fro…

AGV通信第3期|AGV集群智能应急响应系统:从故障感知到快速恢复

随着智慧工厂物流系统复杂度的提升&#xff0c;AGV运行过程中的异常处理能力已成为保障生产连续性的关键指标。面对突发障碍、设备故障等意外状况&#xff0c;传统依赖人工干预的响应模式已无法满足现代智能制造对时效性的严苛要求。 一、AGV异常应急体系面临的挑战 响应时效瓶…

军事目标无人机视角坦克检测数据集VOC+YOLO格式4003张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;4003 标注数量(xml文件个数)&#xff1a;4003 标注数量(txt文件个数)&#xff1a;4003 …

软件安全(二)优化shellcode

我们在上一节课中所写的shellcode&#xff0c;其中使用到的相关的API是通过写入其内存地址来实现调用。这种方法具有局限性&#xff0c;如切换其他的操作系统API的内存地址就会发生变化&#xff0c;从而无法正常调用。 所谓的shellcode不过是在目标程序中加一个区段使得程序可…

RabbitMQ-运维

文章目录 前言运维-集群介绍多机多节点单机多节点 多机多节点下载配置hosts⽂件配置Erlang Cookie启动节点构建集群查看集群状态 单机多节点安装启动两个节点再启动两个节点验证RabbitMQ启动成功搭建集群把rabbit2, rabbit3添加到集群 宕机演示仲裁队列介绍raft算法协议 raft基…

深度学习基础--目标检测常见算法简介(R-CNN、Fast R-CNN、Faster R-CNN、Mask R-CNN、SSD、YOLO)

博主简介&#xff1a;努力学习的22级本科生一枚 &#x1f31f;​&#xff1b;探索AI算法&#xff0c;C&#xff0c;go语言的世界&#xff1b;在迷茫中寻找光芒​&#x1f338;​ 博客主页&#xff1a;羊小猪~~-CSDN博客 内容简介&#xff1a;常见目标检测算法简介​&#x1f…

LINUX CFS算法解析

文章目录 1. Linux调度器的发展历程2. CFS设计思想3. CFS核心数据结构3.1 调度实体(sched_entity)3.2 CFS运行队列(cfs_rq)3.3 任务结构体中的调度相关字段 4. 优先级与权重4.1 优先级范围4.2 权重映射表 (prio_to_weight[])优先级计算4.3.1. static_prio (静态优先级)4.3.2. n…

软考-软件设计师中级备考 14、刷题 算法

一、考点归纳 1&#xff09;排序 2、查找 3、复杂度 4、经典问题 0 - 1 背包动态规划0 - 1 背包问题具有最优子结构性质和重叠子问题性质。通过动态规划可以利用一个二维数组来记录子问题的解&#xff0c;避免重复计算&#xff0c;从而高效地求解出背包能装下的最大价值。分…

Baklib实战企业内容与中台管理差异解析

企业内容管理中台本质差异 企业内容管理系统&#xff08;CMS&#xff09;与内容中台的核心差异在于战略定位与技术路径的本质性区隔。传统CMS聚焦于内容存储与审批流程的线性管理&#xff0c;而内容中台则构建起全域数据服务中枢&#xff0c;通过API接口实现跨系统内容资产调用…

通用外设驱动模型(四步法)

举例&#xff1a;GPIO配置步骤 1、使能时钟 __HAL_RCC_GPIOx_CLK_ENABLE()2、设置工作模式 HAL_GPIO_Init()3、设置输出状态&#xff08;可选&#xff09; HAL_GPIO_WritePin() HAL_GPIO_TogglePin()4、读取输入状态&#xff08;可选&#xff09; HAL_GPIO_ReadPin()模块…

IoT无线组网模块,万物互联的底层通信基石

随着物联网&#xff08;IoT&#xff09;技术在“快车道”上持续飞驰&#xff0c;一场“交互革命”正在人们的日常出行与工作学习等生活场景中加速爆发。从智能家居到智慧城市&#xff0c;从智慧交通到工业自动化&#xff0c;物联网&#xff08;IoT&#xff09;技术凭借着万物互…