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 服务和数据库管理
Nov 11 MySQL
关于MySQL中的 like操作符详情
Nov 17 MySQL
MySQL七大JOIN的具体使用
Feb 28 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
mysql使用instr达到in(字符串)的效果
Apr 03 MySQL
MySQL数据库优化之通过索引解决SQL性能问题
Apr 10 MySQL
MYSQL常用函数介绍
May 05 MySQL
MySQL sql模式设置引起的问题
May 15 MySQL
MySQL普通表如何转换成分区表
May 30 MySQL
sql注入报错之注入原理实例解析
Jun 10 MySQL
MySQL表字段数量限制及行大小限制详情
Jul 23 MySQL
MySQL数据库查询之多表查询总结
Aug 05 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源码加密 仿微盾PHP加密专家(PHPCodeLock)
2010/05/06 PHP
分享一个php 的异常处理程序
2014/06/22 PHP
使用php+swoole对client数据实时更新(一)
2016/01/07 PHP
Zend Framework动作助手Redirector用法实例详解
2016/03/05 PHP
弹出广告特效代码(一个IP只弹出一次)
2007/05/11 Javascript
JavaScript OOP类与继承
2009/11/15 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
使用js检测浏览器是否支持html5中的video标签的方法
2014/03/12 Javascript
jQuery中scrollTop()方法用法实例
2015/01/16 Javascript
js捕捉键盘事件和按键键值的方法
2016/10/10 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
node+express制作爬虫教程
2016/11/11 Javascript
利用Js的console对象,在控制台打印调式信息测试Js的实现
2016/11/26 Javascript
基于JavaScript实现拖动滑块效果
2017/02/16 Javascript
谈谈VUE种methods watch和compute的区别和联系
2017/08/01 Javascript
angularJs 表格添加删除修改查询方法
2018/02/27 Javascript
jQuery实现table表格信息的展开和缩小功能示例
2018/07/21 jQuery
详解小程序如何避免多次点击,重复触发事件
2019/04/08 Javascript
javascript事件监听与事件委托实例详解
2019/08/16 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
Python模块学习 filecmp 文件比较
2012/08/27 Python
跟老齐学Python之模块的加载
2014/10/24 Python
python中Genarator函数用法分析
2015/04/08 Python
python 3.0 模拟用户登录功能并实现三次错误锁定
2017/11/01 Python
django2.0扩展用户字段示例
2019/02/13 Python
Django的models中on_delete参数详解
2019/07/16 Python
django如何通过类视图使用装饰器
2019/07/24 Python
python 中xpath爬虫实例详解
2019/08/26 Python
CSS3弹性伸缩布局之box布局
2016/07/12 HTML / CSS
沃尔玛加拿大:Walmart.ca
2020/03/02 全球购物
党校培训自我鉴定
2014/02/01 职场文书
八一建军节演讲稿
2014/09/10 职场文书
说好普通话圆梦你我他演讲稿
2014/09/21 职场文书
个人工作保证书
2015/02/28 职场文书
2016大学优秀学生干部事迹材料
2016/03/01 职场文书
用Python编写简单的gRPC服务的详细过程
2021/07/04 Python