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 06 MySQL
MySQL创建索引需要了解的
Apr 08 MySQL
MySQL root密码的重置方法
Apr 21 MySQL
MySQL kill不掉线程的原因
May 07 MySQL
MySQL 分组查询的优化方法
May 12 MySQL
MYSQL(电话号码,身份证)数据脱敏的实现
May 28 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL一些常用高级SQL语句
Jul 03 MySQL
Prometheus 监控MySQL使用grafana展示
Aug 30 MySQL
MySQL的存储过程和相关函数
Apr 26 MySQL
MySQL选择合适的备份策略和备份工具
Jun 01 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 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中处理模拟rewrite 效果
2006/12/09 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
2020/08/17 PHP
深入理解PHP中的count函数
2016/05/31 PHP
php判断是否为ajax请求的方法
2016/11/29 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
jquery ajax对特殊字符进行转义防止js注入使用示例
2013/11/21 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(jquery)
2014/11/16 Javascript
jQuery简单实现遍历数组的方法
2015/04/14 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
完美JQuery图片切换效果的简单实现
2016/07/21 Javascript
浅谈JavaScript 中有关时间对象的方法
2016/08/15 Javascript
nodejs和php实现图片访问实时处理
2017/01/05 NodeJs
React实现点击删除列表中对应项
2017/01/10 Javascript
[js高手之路]单例模式实现模态框的示例
2017/09/01 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
[02:10]DOTA2亚洲邀请赛 EG战队出场宣传片
2015/02/07 DOTA
python使用在线API查询IP对应的地理位置信息实例
2014/06/01 Python
Python中的面向对象编程详解(下)
2015/04/13 Python
教你用python3根据关键词爬取百度百科的内容
2016/08/18 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
python实现udp传输图片功能
2020/03/20 Python
Python实现列表中非负数保留,负数转化为指定的数值方式
2020/06/04 Python
Django搭建项目实战与避坑细节详解
2020/12/06 Python
加拿大廉价机票预订网站:CheapOair.ca
2018/03/04 全球购物
毕业生求职找工作的自我评价范文
2013/11/27 职场文书
实习评语
2013/12/16 职场文书
银行门卫岗位职责
2013/12/29 职场文书
挖掘机司机岗位职责
2014/02/12 职场文书
采购助理岗位职责
2014/02/16 职场文书
国家税务局领导班子对照检查材料思想汇报
2014/10/04 职场文书
医学生自荐信范文
2015/03/05 职场文书
垂直极限观后感
2015/06/08 职场文书
初中班主任心得体会
2016/01/07 职场文书
如果用一句诗总结你的上半年,你会用哪句呢?
2019/07/16 职场文书