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 pt-slave-restart工具的使用简介
Apr 07 MySQL
Mysql MVCC机制原理详解
Apr 20 MySQL
MySQL索引知识的一些小妙招总结
May 10 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
浅谈mysql返回Boolean类型的几种情况
Jun 04 MySQL
MySQL为数据表建立索引的原则详解
Mar 03 MySQL
MySQL优化及索引解析
Mar 17 MySQL
mysql 子查询的使用
Apr 28 MySQL
MySQL范围查询优化的场景实例详解
Jun 10 MySQL
MySQL外键约束(Foreign Key)案例详解
Jun 28 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
与空气斗智斗勇的经典《Overlord》,传说中的“无稽之谈”
2020/04/09 日漫
php学习之数据类型之间的转换代码
2011/05/29 PHP
PHP耦合设计模式实例分析
2018/08/08 PHP
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
2006/11/07 Javascript
又一个小巧的图片预加载类
2007/05/05 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
2009/10/14 Javascript
子窗口、父窗口和Silverlight之间的相互调用
2010/08/16 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JQuery鼠标移到小图显示大图效果的方法
2015/06/10 Javascript
json格式数据的添加,删除及排序方法
2016/01/21 Javascript
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
2016/12/14 Javascript
webpack进阶——缓存与独立打包的用法
2017/08/02 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
Vue.js 动态为img的src赋值方法
2018/03/14 Javascript
如何解决js函数防抖、节流出现的问题
2019/06/17 Javascript
VUE实现自身整体组件销毁的示例代码
2020/01/13 Javascript
JS实现前端动态分页码代码实例
2020/06/02 Javascript
[01:15]《辉夜杯》北京网鱼队巡礼
2015/10/26 DOTA
Python在图片中添加文字的两种方法
2017/04/29 Python
老生常谈Python startswith()函数与endswith函数
2017/09/08 Python
Python爬虫_城市公交、地铁站点和线路数据采集实例
2018/01/10 Python
python 批量修改/替换数据的实例
2018/07/25 Python
Linux下多个Python版本安装教程
2018/08/15 Python
对python特殊函数 __call__()的使用详解
2019/07/02 Python
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
Perfume’s Club英国官网:购买香水和护肤品
2019/11/02 全球购物
设计模式的基本要素是什么
2014/04/21 面试题
修理厂厂长岗位职责
2014/01/30 职场文书
合同协议书格式
2014/04/18 职场文书
岗位职责说明书模板
2014/07/30 职场文书
2014年教师业务工作总结
2014/12/19 职场文书
硕士学位论文评语
2014/12/31 职场文书
小学安全工作总结2015
2015/05/18 职场文书
新生开学寄语大全
2015/05/28 职场文书
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python