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 重写查询语句的三种策略
May 10 MySQL
Mysql中 unique列插入重复值该怎么解决呢
May 26 MySQL
zabbix监控mysql的实例方法
Jun 02 MySQL
MySQL快速插入一亿测试数据
Jun 23 MySQL
Mysql关于数据库是否应该使用外键约束详解说明
Oct 24 MySQL
面试被问select......for update会锁表还是锁行
Nov 11 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
CentOS MySql8 远程连接实战
Apr 19 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 MySQL
关于MySQL中explain工具的使用
May 08 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
ajax 的post方法实例(带循环)
2011/07/04 PHP
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php在线解压ZIP文件的方法
2014/12/30 PHP
实现php删除链表中重复的结点
2018/09/27 PHP
jQuery Study Notes学习笔记 (二)
2010/08/04 Javascript
jQuery用unbind方法去掉hover事件及其他方法介绍
2013/03/18 Javascript
JQuery+CSS提示框实现思路及代码(纯手工打造)
2013/05/07 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
JavaScript模拟鼠标右键菜单效果
2020/12/08 Javascript
创建一个类Person的简单实例
2016/05/17 Javascript
js实现日历的简单算法
2017/01/24 Javascript
ES6新特性之类(Class)和继承(Extends)相关概念与用法分析
2017/05/24 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
js中split()方法得到的数组长度问题
2018/07/19 Javascript
JavaScript时间日期操作实例小结【5个示例】
2018/12/22 Javascript
js键盘事件实现人物的行走
2020/01/17 Javascript
详解vue-template-admin三级路由无法缓存的解决方案
2020/03/10 Javascript
jQuery 动画与停止动画效果实例详解
2020/05/19 jQuery
vue使用screenfull插件实现全屏功能
2020/09/17 Javascript
[04:27]DOTA2官方论坛水友赛集锦
2013/09/16 DOTA
[50:15]VP vs Mineski 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
2009/04/09 Python
python实现上传样本到virustotal并查询扫描信息的方法
2014/10/05 Python
python中Switch/Case实现的示例代码
2017/11/09 Python
详解pandas中MultiIndex和对象实际索引不一致问题
2019/07/23 Python
Python Opencv轮廓常用操作代码实例解析
2020/09/01 Python
Python datetime 如何处理时区信息
2020/09/02 Python
HTML+CSS3+JS 实现的下拉菜单
2020/11/25 HTML / CSS
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
彩色的非洲教学反思
2014/02/18 职场文书
个人委托书格式
2014/04/04 职场文书
好听的队名和口号
2014/06/09 职场文书
初三毕业评语
2014/12/26 职场文书
廉政承诺书
2015/01/19 职场文书
2016年小学六一儿童节活动总结
2016/04/06 职场文书
Pytorch中使用ImageFolder读取数据集时忽略特定文件
2022/03/23 Python