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 31 MySQL
MySQL 常见的数据表设计误区汇总
Jun 07 MySQL
Mysql数据库值的添加、修改、删除及清空操作实例
Jun 20 MySQL
MySQL系列之八 MySQL服务器变量
Jul 02 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
一篇文章看懂MySQL主从复制与读写分离
Nov 07 MySQL
Mysql中有关Datetime和Timestamp的使用总结
Dec 06 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
MySQL 开窗函数
Feb 15 MySQL
mysql数据插入覆盖和时间戳的问题及解决
Mar 25 MySQL
MySQL插入数据与查询数据
Mar 25 MySQL
Mysql InnoDB 的内存逻辑架构
May 06 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
3个PHP多维数组转为一维数组的方法实例
2014/03/13 PHP
php 无限级分类,超级简单的无限级分类,支持输出树状图
2014/06/29 PHP
php+ajax实现无刷新数据分页的办法
2015/11/02 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
2016/10/09 PHP
PDO::errorCode讲解
2019/01/28 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
详解PHP的抽象类和抽象方法以及接口总结
2019/03/15 PHP
JS 统计时间
2021/03/09 Javascript
返回顶部按钮响应滚动且动态显示与隐藏
2014/10/14 Javascript
浅析JavaScript事件和方法
2015/02/28 Javascript
Jquery中巧用Ajax的beforeSend方法
2016/01/20 Javascript
JavaScript数组去重由慢到快由繁到简(优化篇)
2016/08/26 Javascript
vue.js表格分页示例
2016/10/18 Javascript
详解Vue中数组和对象更改后视图不刷新的问题
2018/09/21 Javascript
Mint UI组件库CheckList使用及踩坑总结
2018/12/20 Javascript
Layui tree 下拉菜单树的实例代码
2019/09/21 Javascript
layer扩展打开/关闭动画的方法
2019/09/23 Javascript
浅探express路由和中间件的实现
2019/09/30 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
javascript设计模式之装饰者模式
2020/01/30 Javascript
[50:45]2018DOTA2亚洲邀请赛 4.6 淘汰赛 VP vs TNC 第一场
2018/04/10 DOTA
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
简单了解Python下用于监视文件系统的pyinotify包
2015/11/13 Python
Python中文分词实现方法(安装pymmseg)
2016/06/14 Python
Golang与python线程详解及简单实例
2017/04/27 Python
Python对列表的操作知识点详解
2019/08/20 Python
Pytorch学习之torch用法----比较操作(Comparison Ops)
2020/06/28 Python
基于CSS3实现立方体自转效果
2016/03/01 HTML / CSS
如何用Python来进行查询和替换一个文本字符串
2014/01/02 面试题
商务英语专业应届毕业生求职信
2013/10/28 职场文书
小学清明节活动方案
2014/03/08 职场文书
节能环保标语
2014/06/12 职场文书
安全例会汇报材料
2014/08/23 职场文书
2016年4月份红领巾广播稿
2015/12/21 职场文书
公开致歉信
2019/06/24 职场文书
spring注解 @PropertySource配置数据源全流程
2022/03/25 Java/Android