SQL实现LeetCode(180.连续的数字)


Posted in MySQL onAugust 04, 2021

[LeetCode] 180.Consecutive Numbers 连续的数字

Write a SQL query to find all numbers that appear at least three times consecutively.

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+

For example, given the above Logs table, 1 is the only number that appears consecutively for at least three times.

这道题给了我们一个Logs表,让我们找Num列中连续出现相同数字三次的数字,那么由于需要找三次相同数字,所以我们需要建立三个表的实例,我们可以用l1分别和l2, l3内交,l1和l2的Id下一个位置比,l1和l3的下两个位置比,然后将Num都相同的数字返回即可:

解法一:

SELECT DISTINCT l1.Num FROM Logs l1
JOIN Logs l2 ON l1.Id = l2.Id - 1
JOIN Logs l3 ON l1.Id = l3.Id - 2
WHERE l1.Num = l2.Num AND l2.Num = l3.Num;

下面这种方法没用用到Join,而是直接在三个表的实例中查找,然后把四个条件限定上,就可以返回正确结果了:

解法二:

SELECT DISTINCT l1.Num 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;

再来看一种画风截然不同的方法,用到了变量count和pre,分别初始化为0和-1,然后需要注意的是用到了IF语句,MySQL里的IF语句和我们所熟知的其他语言的if不太一样,相当于我们所熟悉的三元操作符a?b:c,若a真返回b,否则返回c。那么我们先来看对于Num列的第一个数字1,pre由于初始化是-1,和当前Num不同,所以此时count赋1,此时给pre赋为1,然后Num列的第二个1进来,此时的pre和Num相同了,count自增1,到Num列的第三个1进来,count增加到了3,此时满足了where条件,t.n >= 3,所以1就被select出来了,以此类推遍历完整个Num就可以得到最终结果:

解法三:

SELECT DISTINCT Num FROM (
SELECT Num, @count := IF(@pre = Num, @count + 1, 1) AS n, @pre := Num
FROM Logs, (SELECT @count := 0, @pre := -1) AS init
) AS t WHERE t.n >= 3;

参考资料:

https://leetcode.com/discuss/54463/simple-solution

https://leetcode.com/discuss/87854/simple-sql-with-join-1484-ms

https://leetcode.com/discuss/69767/two-solutions-inner-join-and-two-variables

到此这篇关于SQL实现LeetCode(180.连续的数字)的文章就介绍到这了,更多相关SQL实现连续的数字内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

MySQL 相关文章推荐
Mysql服务添加 iptables防火墙策略的方案
Apr 29 MySQL
MySQL触发器的使用
May 24 MySQL
MySql开发之自动同步表结构
May 28 MySQL
mysql 如何获取两个集合的交集/差集/并集
Jun 08 MySQL
MySQL高速缓存启动方法及参数详解(query_cache_size)
Jul 01 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
MySQL分区表实现按月份归类
Nov 01 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
MySQL多表查询机制
Mar 17 MySQL
CentOS 7安装mysql5.7使用XtraBackUp备份工具命令详解
Apr 12 MySQL
分析MySQL优化 index merge 后引起的死锁
Apr 19 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
Mysql中where与on的区别及何时使用详析
Aug 04 #MySQL
SQL实现LeetCode(178.分数排行)
Aug 04 #MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 #MySQL
MySQL千万级数据表的优化实战记录
Aug 04 #MySQL
SQL实现LeetCode(176.第二高薪水)
Aug 04 #MySQL
Mysql8.0递归查询的简单用法示例
Aug 04 #MySQL
SQL之各种join小结详细讲解
You might like
AMFPHP php远程调用(RPC, Remote Procedure Call)工具 快速入门教程
2010/05/10 PHP
php数组函数序列之array_splice() - 在数组任意位置插入元素
2011/11/07 PHP
详解WordPress中的头像缓存和代理中的缓存更新方法
2016/03/01 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
javascript flash下fromCharCode和charCodeAt方法使用说明
2008/01/12 Javascript
js判断数据类型如判断是否为数组是否为字符串等等
2014/01/15 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
AngularJS数据源的多种获取方式汇总
2016/02/02 Javascript
老生常谈原生JS执行环境与作用域
2016/11/22 Javascript
微信小程序 scroll-view实现上拉加载与下拉刷新的实例
2017/01/21 Javascript
axios对请求各种异常情况处理的封装方法
2018/09/25 Javascript
浅谈针对Vue相同路由不同参数的刷新问题
2018/09/29 Javascript
微信小程序 JS动态修改样式的实现方法
2018/12/16 Javascript
JavaScript中callee和caller的区别与用法实例分析
2019/06/28 Javascript
简单了解three.js 着色器材质
2020/08/03 Javascript
[05:39]2014DOTA2国际邀请赛 DK晋级胜者组专访战队国士无双
2014/07/14 DOTA
Python的Bottle框架的一些使用技巧介绍
2015/04/08 Python
Python中特殊函数集锦
2015/07/27 Python
实例讲解Python中函数的调用与定义
2016/03/14 Python
python爬虫基本知识
2018/03/05 Python
python 常用的基础函数
2018/07/10 Python
python中强大的format函数实例详解
2018/12/05 Python
Django框架使用mysql视图操作示例
2019/05/15 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
Django实现发送邮件功能
2019/07/18 Python
Python 实现加密过的PDF文件转WORD格式
2020/02/04 Python
python3正则模块re的使用方法详解
2020/02/11 Python
大数据分析用java还是Python
2020/07/06 Python
使用css3实现超炫的loading加载动画效果
2014/05/07 HTML / CSS
平面设计自荐信
2013/10/07 职场文书
学生会竞选演讲稿纪检部
2014/08/25 职场文书
食堂厨师岗位职责
2014/08/25 职场文书
学生逃课万能检讨书2000字
2015/02/17 职场文书
史上最全书信经典范文大全(建议收藏)
2019/07/10 职场文书
SpringAop日志找不到方法的处理
2021/06/21 Java/Android
MySQL利用UNION连接2个查询排序失效详解
2021/11/20 MySQL