【LeetCode 题解】数据库:180. 连续出现的数字

一、问题描述

给定一个Logs表,包含自增 ID 和数字字段:

CREATE TABLE Logs (id INT PRIMARY KEY AUTO_INCREMENT,num VARCHAR(50)
);

要求编写 SQL 查询,找出所有至少连续出现三次的数字。例如:

+----+-----+
| id | num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
+----+-----+

输出应为:

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

二、核心思路解析

问题本质

需要识别表中连续出现至少三次的相同数字。关键点在于:

  1. 连续条件:相邻行的num值相同

  2. 次数统计:连续次数≥3 次

  3. 去重需求:相同数字只需返回一次

关键技术点

1. 如何判断连续?
  • 自连接法:通过表自连接比较相邻行

  • 窗口函数法:使用LAG()获取前一行数据

2. 如何统计连续次数?
  • 滑动窗口:检查当前行与前两行是否相同

  • 状态标记:用变量记录当前连续状态

三、解决方案详解

方法一:自连接法

实现逻辑

通过三次自连接,将当前行与前两行进行比较:

SELECT DISTINCT a.num AS ConsecutiveNums
FROM Logs a
JOIN Logs b ON a.id = b.id + 1
JOIN Logs c ON a.id = c.id + 2
WHERE a.num = b.num AND b.num = c.num;
执行流程

以示例数据为例:

  1. 连接条件

  • a.id = b.id + 1 → 当前行与前一行
  • a.id = c.id + 2 → 当前行与前两行
  1. 过滤条件:三个连续行的num相同

  2. 去重处理:使用DISTINCT避免重复结果

方法二:窗口函数法(推荐)

实现逻辑

使用LAG()窗口函数获取前两行数据:

SELECT DISTINCT num AS ConsecutiveNums
FROM (SELECT num,LAG(num, 1) OVER (ORDER BY id) AS prev1,LAG(num, 2) OVER (ORDER BY id) AS prev2FROM Logs
) AS sub
WHERE num = prev1 AND prev1 = prev2;
执行流程
  1. 子查询

  • LAG(num, 1)获取前一行的num
  • LAG(num, 2)获取前两行的num
  1. 过滤条件:当前行与前两行num相同

  2. 去重处理:使用DISTINCT确保唯一结果

四、两种方法对比

维度自连接法窗口函数法
代码复杂度★★★☆☆★★☆☆☆
执行效率低(需三次表扫描)高(单次扫描)
可读性较低(需理解自连接逻辑)高(直观的前向引用)
适用场景旧版本数据库(如 MySQL 5.x)现代数据库(MySQL 8.0+)

推荐场景

  • 优先使用窗口函数法(简洁高效)

  • 若数据库不支持窗口函数,使用自连接法

五、扩展优化

动态处理任意连续次数

将固定的 3 次改为变量N

CREATE FUNCTION getConsecutiveNums(N INT) RETURNS TABLE
RETURN
SELECT DISTINCT num AS ConsecutiveNums
FROM (SELECT num,LAG(num, 1) OVER (ORDER BY id) AS prev1,LAG(num, 2) OVER (ORDER BY id) AS prev2FROM Logs
) AS sub
WHERE num = prev1 AND prev1 = prev2;

处理更长连续次数

对于连续 5 次的情况,只需增加更多LAG()调用:

SELECT DISTINCT num
FROM (SELECT num,LAG(num, 1) OVER (ORDER BY id) AS prev1,LAG(num, 2) OVER (ORDER BY id) AS prev2,LAG(num, 3) OVER (ORDER BY id) AS prev3,LAG(num, 4) OVER (ORDER BY id) AS prev4FROM Logs
) AS sub
WHERE num = prev1 AND prev1 = prev2 AND prev2 = prev3 AND prev3 = prev4;

六、测试用例验证

测试用例 1:正常情况

输入

INSERT INTO Logs (num) VALUES
('1'),('1'),('1'),('2'),('1'),('2'),('2');

预期输出

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

测试用例 2:多个连续数字

输入

INSERT INTO Logs (num) VALUES
('5'),('5'),('5'),('5'),('3'),('3'),('3');

预期输出

+-----------------+
| ConsecutiveNums |
+-----------------+
| 5               |
| 3               |
+-----------------+

测试用例 3:边界情况

输入

INSERT INTO Logs (num) VALUES
('a'),('a'),('a'),('a');

预期输出

+-----------------+
| ConsecutiveNums |
+-----------------+
| a               |
+-----------------+

七、常见问题解答

Q:为什么需要使用DISTINCT
A:防止同一数字多次出现在结果中(例如连续 4 次会产生两条记录)。

Q:如果连续次数超过 3 次会怎样?
A:会被正确识别,因为只要存在至少连续 3 次即可。

Q:如何处理非常大的表?
A:为id字段添加索引,提升窗口函数性能。

八、总结

  • 核心逻辑:通过比较当前行与前两行的值,判断是否连续相同。

  • 关键技巧

    • 自连接法:适用于所有数据库版本

    • 窗口函数法:简洁高效,推荐使用

  • 扩展应用

    • 动态处理任意连续次数

    • 处理更复杂的业务场景(如连续登录天数)

感谢各位的阅读,后续将持续给大家讲解力扣中的算法题和数据库题,如果觉得这篇内容对你有帮助,别忘了点赞和关注,后续还有更多精彩的算法解析与你分享!

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

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

相关文章

MaxEnt模型进阶:基于R语言自动化与GIS空间建模的物种栖息地精准预测

生物多样性的空间分布规律及其对环境变化的响应机制,是生态学与地理学研究的前沿议题。在气候变化加剧和人类活动干扰的双重压力下,如何精准预测物种潜在分布范围、识别关键环境驱动因子,已成为制定生物保护策略的核心科学问题。物种分布模型…

缓存雪崩解决方案:二级缓存VS随机TTL

背景 在学习缓存雪崩的时候,了解到有二级缓存和随机TTL两个解决方案,但是在学习之后,个人认为二级缓存本质上还是利用两层缓存的过期时间不一致来实现缓存过期时间随机化,这不就是和随机TTL一样吗,故有了这篇思考&…

Android View事件分发机制深度解析

在Android面试中,关于View事件分发机制的考察往往不仅限于基础流程,更关注底层原理、性能优化和实际应用场景。以下是针对面试的全面回答策略: 一、基础回答框架 核心三要素: 传递流程 "事件分发遵循Activity → Window →…

2829. k-avoiding 数组的最小总和

2829. k-avoiding 数组的最小总和 题目链接:2829. k-avoiding 数组的最小总和 代码如下: class Solution { public:int minimumSum(int n, int k) {int m min(k / 2, n);return (m * (m 1) (k * 2 n - m - 1) * (n - m)) / 2;} };

phpStorm2021.3.3在windows系统上配置Xdebug调试

开始 首先根据PHP的版本下载并安装对应的Xdebug扩展在phpStorm工具中找到设置添加服务添加php web page配置完信息后 首先根据PHP的版本下载并安装对应的Xdebug扩展 我使用的是phpStudy工具,直接在php对应的版本中开启xdebug扩展, 并在php.ini中添加如下…

LabVIEW永磁同步电机性能测试系统

开发了一种基于LabVIEW的永磁同步电机(PMSM)性能测试系统的设计及应用。该系统针对新能源汽车使用的电机进行稳态性能测试,解决了传统测试方法成本高、效率低的问题,实现了测试自动化,提高了数据的准确性和客观性。 ​…

谷粒商城:Redisson

目录 Redisson 整合Redisson RLock RReadWriteLock RSemaphore RCountDownLatch 优化三级分类缓存 缓存一致性问题 双写模式 失效模式 脏数据解决 Redisson 提供redis分布式锁(Distributed locks with Redis)的java客户端 整合Redisson 引入 …

Linux系统调用编程

目录 一. 理解进程和线程的概念。并在Linux系统下进行相应操作 1.1概念 1.1.1进程(Process) 1.1.2 线程(Thread) 1.2操作 1.2.1用 ps -a 命令查看系统中各进程的编号pid 1.2.2用kill 命令终止一个进程pid 二. 解释Linux的“虚拟内存管理”,它与stm32中的 真…

25-智慧旅游系统(协同算法)三端

介绍 技术: 基于 B/S 架构 SpringBootMySQLLayuivue 环境: Idea mysql maven jdk1.8 node 管理端功能 首页展示图表:以数据可视化方式展示关键业务数据。 用户管理:管理系统用户,包括查看、编辑等操作。 供应商管…

【stm32--HAL库DMA+USART+空闲中断不定长收发数据】

串口通信-Hal库实现不定长度收发,DMAUSART DMA串口STM32CUBEMX配置(工程创建)基础配置时钟配置工程配置 代码编写现象 DMA 在正式配置之前,我们先来一起简单了解一下DMA。DMA(Direct Memory Access,直接内…

沉浸式体验测评|AI Ville:我在Web3小镇“生活”了一周

最近,我在朋友的推荐下,体验了 aivillebot 的项目。起初,我只是抱着试试看的心态,心想这不就是个 Web3 版的《星露谷物语》吗? 但是一周下来,我发现这个虚拟小镇也没那么简单——里面的居民不是目前端游或链…

FPGA学习-基于 DE2-115 板的 Verilog 分秒计数器设计与按键功能实现

一、核心功能设计 按键暂停/继续:通过KEY1控制计时状态 按键消抖处理:20ms消抖周期消除机械抖动 硬件资源分配:符合DE2-115开发板引脚规范 二、核心模块实现详解 1. 顶层模块(counter) module counter(input CL…

后端开发 SpringBoot 工程模板

概述 本篇文章主要记录如何开发一个通用的 SpringBoot 工程开发框架的项目模板,这样后续需要开发项目时就可以直接开箱直用了,省区了很多重复步骤。 项目初始化 创建项目: 按照我的选项来选,然后点击 create,等待文…

OpenCv(五)——边缘检测

目录 边缘检测 一、sobel算子边缘检测 (1)原理 1、X轴方向的边缘检测 2、Y轴方向的边缘检测 (2)sobel算子参数 (3)X轴方向边缘检测代码演示 1、显示圆的图像 2、x方向上的边缘检测&#xf…

无人机数据链技术及运行方式详解!

一、无人机数据链技术要点 1. 通信传输技术 频段选择: 常用频段包括 L波段(1-2 GHz)、C波段(4-8 GHz)、Ku/K波段(12-40 GHz),不同频段在传输距离、带宽和抗干扰性间权衡。 低…

AI Agent 实战:搭建个人在线旅游助手

AI Agent 实战:搭建个人在线旅游助手 本次实验中,我们将继续探索 Agent 的提示词,学习更加规范的提示词撰写方法。 本实验中你将掌握的知识点 使用 Dify 构建 Agent 的方法结构化的提示词撰写技巧变量的使用方法 1. 准备 在新建 Agent 之…

检索增强生成(RAG):强化 AI 智能体的知识 “武装”

技术点目录 第一章、智能体(Agent)入门第二章、基于字节Coze 构建智能体(Agent)第三章、基于其他平台构建智能体(Agent)第四章、国内外智能体(Agent)经典案例详解第五章、大语言模型应用开发框架LangChain入门第六章、基于LangChain的大模型API接入第七章…

vscode 打开工程 看不到文件目录

vscode 打开工程 看不到文件目录 View->Explorer 快捷键:CtrlShiftE

厘米级定位赋能智造升级:品铂科技UWB技术驱动工厂全流程自动化与效能跃升”

在智能制造中的核心价值体现在‌高精度定位、流程优化、安全管理‌等多个维度,具体应用如下: 一、‌核心技术与定位能力‌ ‌厘米级高精度定位‌ UWB技术通过‌纳秒级窄脉冲信号‌(带宽超500MHz)实现高时间分辨率,结合…

getID3获取本地或远程视频时长

音频文件也可使用,使用ffmeg安装太复杂了 附ffmpeg方式:centos下安装ffmpeg_yum安装ffmpeg-CSDN博客 使用composer先安装 composer require james-heinrich/getid3 获取本地视频 //获取本地视频$video_path $_SERVER[DOCUMENT_ROOT].$params[video];…