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之高可用集群部署及故障切换实现
Apr 22 MySQL
52条SQL语句教你性能优化
May 25 MySQL
MySQL修改默认引擎和字符集详情
Sep 25 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
MySQL表锁、行锁、排它锁及共享锁的使用详解
Apr 02 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
MySQL中优化SQL语句的方法(show status、explain分析服务器状态信息)
Apr 09 MySQL
MySQL数据库如何使用Shell进行连接
Apr 12 MySQL
MySQL提升大量数据查询效率的优化神器
Jul 07 MySQL
MySQL 原理优化之Group By的优化技巧
Aug 14 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
PHP测试程序运行时间的类
2012/02/05 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
2014/09/27 PHP
php导入大量数据到mysql性能优化技巧
2014/12/29 PHP
PHP的伪随机数与真随机数详解
2015/05/27 PHP
PHP配置把错误日志以邮件方式发送方法(Windows系统)
2015/06/23 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
2016/02/16 PHP
Javascript技术技巧大全(五)
2007/01/22 Javascript
javascript web页面刷新的方法收集
2009/07/02 Javascript
javaScript 判断字符串是否为数字的简单方法
2009/07/25 Javascript
jquery 日期分离成年月日的代码
2010/05/14 Javascript
javascript获取当前鼠标坐标的方法
2015/01/10 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
2015/02/02 Javascript
Ionic如何实现下拉刷新与上拉加载功能
2016/06/03 Javascript
js实现获取两个日期之间所有日期的方法
2016/06/17 Javascript
seaJs使用心得之exports与module.exports的区别实例分析
2017/10/13 Javascript
JS中数组与对象的遍历方法实例小结
2018/08/14 Javascript
vue实现滑动切换效果(仅在手机模式下可用)
2020/06/29 Javascript
node.JS路径解析之PATH模块使用方法详解
2020/02/06 Javascript
javascript 数组精简技巧小结
2020/02/26 Javascript
vue使用canvas实现移动端手写签名
2020/09/22 Javascript
[01:52]2014DOTA2西雅图邀请赛 V社开大会你不知道的小秘密
2014/07/08 DOTA
python中使用OpenCV进行人脸检测的例子
2014/04/18 Python
python中__slots__用法实例
2015/06/04 Python
Python中类的初始化特殊方法
2017/12/01 Python
python根据unicode判断语言类型实例代码
2018/01/17 Python
Python开发的十个小贴士和技巧及长常犯错误
2018/09/27 Python
Python 用turtle实现用正方形画圆的例子
2019/11/21 Python
PyQt5实现登录页面
2020/05/30 Python
python缩进长度是否统一
2020/08/02 Python
Python urllib3软件包的使用说明
2020/11/18 Python
python 用Matplotlib作图中有多个Y轴
2020/11/28 Python
前台文员岗位职责及工作流程
2013/11/19 职场文书
入党推优材料
2014/06/02 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
五年级数学教学反思
2016/02/16 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript