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问题:由于找不到MSVCR120.dll,无法继续执行代码
Jun 26 MySQL
浅谈MySQL之select优化方案
Aug 07 MySQL
教你使用VS Code的MySQL扩展管理数据库的方法
Jan 22 MySQL
解决Mysql多行子查询的使用及空值问题
Jan 22 MySQL
MySQL读取JSON转换的方式
Mar 18 MySQL
如何创建一个创建MySQL数据库中的datetime类型
Mar 21 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 MySQL
MySQL批量更新不同表中的数据
May 11 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
DQL数据查询语句使用示例
Dec 24 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
Sony CFR 320 修复改造
2020/03/14 无线电
解析PHP对现有搜索引擎的调用
2013/06/25 PHP
phpstudy默认不支持64位php的解决方法
2017/02/20 PHP
php微信开发之图片回复功能
2018/06/14 PHP
JavaScript使用prototype定义对象类型(转)[
2006/12/22 Javascript
JavaScript对象、属性、事件手册集合方便查询
2010/07/04 Javascript
Javascript 完美运动框架(逐行分析代码,让你轻松了运动的原理)
2015/01/23 Javascript
JQuery统计input和textarea文字输入数量(代码分享)
2016/12/29 Javascript
JS实现评价的星星功能
2017/08/20 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
微信小程序使用radio显示单选项功能【附源码下载】
2017/12/11 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
JavaScript实现页面中录音功能的方法
2019/06/04 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
layui字体图标 loading图标静止不旋转的解决方法
2019/09/23 Javascript
BootstrapValidator验证用户名已存在(ajax)
2019/11/08 Javascript
JSONObject与JSONArray使用方法解析
2020/09/28 Javascript
[06:07]辉夜杯现场观众互动 “比谁远送显示器”
2015/12/26 DOTA
Python中3种内建数据结构:列表、元组和字典
2014/11/30 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
Python2/3中urllib库的一些常见用法
2017/12/19 Python
python中for循环变量作用域及用法详解
2019/11/05 Python
python和php哪个容易学
2020/06/19 Python
浅析Python 简单工厂模式和工厂方法模式的优缺点
2020/07/13 Python
一篇文章教你用python画动态爱心表白
2020/11/22 Python
NBA欧洲商店(英国):NBA Europe Store UK
2018/07/27 全球购物
KIKO MILANO俄罗斯官网:意大利领先的化妆品和护肤品品牌
2021/01/09 全球购物
数学国培研修感言
2014/02/13 职场文书
护理专科自荐书范文
2014/02/18 职场文书
2014学习优秀共产党员先进事迹思想汇报
2014/09/14 职场文书
电子商务实训报告总结
2014/11/05 职场文书
检讨书模板大全
2015/05/07 职场文书
2019奶茶店创业计划书范本!
2019/07/15 职场文书
神州牡丹园的导游词
2019/11/20 职场文书
Python insert() / append() 用法 Leetcode实战演示
2021/03/31 Python
Java中的随机数Random
2022/03/17 Java/Android