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 相关文章推荐
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
一篇文章弄懂MySQL查询语句的执行过程
May 07 MySQL
MySql存储过程之逻辑判断和条件控制
May 26 MySQL
MySQL连接查询你真的学会了吗?
Jun 02 MySQL
你知道哪几种MYSQL的连接查询
Jun 03 MySQL
MySQL千万级数据表的优化实战记录
Aug 04 MySQL
mysql分表之后如何平滑上线详解
Nov 01 MySQL
Mysql超详细讲解死锁问题的理解
Apr 01 MySQL
详细聊一聊mysql的树形结构存储以及查询
Apr 05 MySQL
Windows 64位 安装 mysql 8.0.28 图文教程
Apr 19 MySQL
MySQL GTID复制的具体使用
May 20 MySQL
MySQL 自动填充 create_time 和 update_time
May 20 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
打造计数器DIY三步曲(中)
2006/10/09 PHP
限制ckeditor上传图片文件大小的方法
2013/11/15 PHP
PHP生成数组再传给js的方法
2014/08/07 PHP
php将csv文件导入到mysql数据库的方法
2014/12/24 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
jQuery学习笔记之Helloworld
2010/12/22 Javascript
Iframe自适应高度绝对好使的代码 兼容IE,遨游,火狐
2011/01/27 Javascript
Extjs中ComboBoxTree实现的下拉框树效果(自写)
2013/05/28 Javascript
用js来刷新当前页面保留参数的具体实现
2013/12/23 Javascript
JavaScript也谈内存优化
2014/06/06 Javascript
$.extend 的一个小问题
2015/06/18 Javascript
使用jQuery的easydrag插件实现可拖动的DIV弹出框
2016/02/19 Javascript
jQuery多级联动下拉插件chained用法示例
2016/08/20 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
vue如何实现observer和watcher源码解析
2017/03/09 Javascript
Vue导出页面为PDF格式的实现思路
2018/07/31 Javascript
VUE 动态组件的应用案例分析
2019/12/02 Javascript
vue element-ui实现input输入框金额数字添加千分位
2019/12/29 Javascript
vue中实现点击按钮滚动到页面对应位置的方法(使用c3平滑属性实现)
2019/12/29 Javascript
微信小程序如何通过用户授权获取手机号(getPhoneNumber)
2020/01/21 Javascript
[55:26]DOTA2-DPC中国联赛 正赛 Aster vs LBZS BO3 第一场 2月23日
2021/03/11 DOTA
用Python编写脚本使IE实现代理上网的教程
2015/04/23 Python
Python过滤列表用法实例分析
2016/04/29 Python
Python编码类型转换方法详解
2016/07/01 Python
深入理解python中的select模块
2017/04/23 Python
matplotlib绘制动画代码示例
2018/01/02 Python
win10下tensorflow和matplotlib安装教程
2018/09/19 Python
详解opencv中画圆circle函数和椭圆ellipse函数
2019/12/27 Python
django 连接数据库出现1045错误的解决方式
2020/05/14 Python
一款利用html5和css3实现的3D滚动特效的教程
2015/01/04 HTML / CSS
CSS3实现瀑布流布局与无限加载图片相册的实例代码
2016/12/22 HTML / CSS
应届硕士毕业生自荐信
2014/05/26 职场文书
2016年会开场白台词
2015/06/01 职场文书
Matplotlib可视化之添加让统计图变得简单易懂的注释
2021/06/11 Python
JS中forEach()、map()、every()、some()和filter()的用法
2022/05/11 Javascript
利用nginx搭建RTMP视频点播、直播、HLS服务器
2022/05/25 Servers