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 相关文章推荐
left join、inner join、right join的区别
Apr 05 MySQL
MySQL命令行操作时的编码问题详解
Apr 14 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
Jun 26 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
mysql脏页是什么
Jul 26 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
一次SQL如何查重及去重的实战记录
Mar 13 MySQL
详解MySQL的主键查询为什么这么快
Apr 03 MySQL
MySQL自定义函数及触发器
Aug 05 MySQL
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
Aug 14 MySQL
MySQL中LAG()函数和LEAD()函数的使用
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基于socket实现SMTP发送邮件的方法
2015/03/05 PHP
ThinkPHP数据操作方法总结
2015/09/28 PHP
php轻松实现文件上传功能
2016/03/03 PHP
javascript 日期时间函数(经典+完善+实用)
2009/05/27 Javascript
JavaScript打开word文档的实现代码(c#)
2012/04/16 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
Extjs 3.3切换tab隐藏相应工具栏出现空白解决
2013/04/02 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
javascript实现画不相交的圆
2015/04/07 Javascript
介绍JavaScript的一个微型模版
2015/06/24 Javascript
如何利用模板将HTML从JavaScript中抽离
2016/10/08 Javascript
利用Vue.js实现checkbox的全选反选效果
2017/01/18 Javascript
Vue在页面数据渲染完成之后的调用方法
2018/09/11 Javascript
JavaScript迭代器的含义及用法
2019/06/21 Javascript
Vue 3.0双向绑定原理的实现方法
2019/10/23 Javascript
js函数柯里化的方法和作用实例分析
2020/04/11 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
python使用urllib2模块获取gravatar头像实例
2013/12/18 Python
Python Requests库基本用法示例
2018/08/20 Python
Python反爬虫伪装浏览器进行爬虫
2020/02/28 Python
python + selenium 刷B站播放量的实例代码
2020/06/12 Python
PyCharm vs VSCode,作为python开发者,你更倾向哪种IDE呢?
2020/08/17 Python
澳大利亚现代波西米亚风格女装网站:Bohemian Traders
2018/04/16 全球购物
TALLY WEiJL法国网上商店:服装、时装及配饰
2019/08/31 全球购物
ECCO俄罗斯官网:北欧丹麦鞋履及皮具品牌
2020/06/26 全球购物
商务日语毕业生自荐信
2013/11/23 职场文书
简单英文演讲稿
2014/01/01 职场文书
2014年自我评价
2014/01/04 职场文书
财务人员的自我评价范文
2014/03/03 职场文书
绿化工程实施方案
2014/03/17 职场文书
还款承诺书范文
2014/05/20 职场文书
助人为乐模范事迹材料
2014/06/02 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
django学习之ajax post传参的2种格式实例
2021/05/14 Python
python基础之文件操作
2021/10/24 Python