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 相关文章推荐
Windows10下安装MySQL8
Apr 06 MySQL
jdbc使用PreparedStatement批量插入数据的方法
Apr 27 MySQL
MySQL中你可能忽略的COLLATION实例详解
May 12 MySQL
MySQL中in和exists区别详解
Jun 03 MySQL
MySQL中的布尔值,怎么存储false或true
Jun 04 MySQL
MYSQL 表的全面总结
Nov 11 MySQL
MySQL创建定时任务
Jan 22 MySQL
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
Mar 22 MySQL
MySQL数据库Innodb 引擎实现mvcc锁
May 06 MySQL
MySQL中的全表扫描和索引树扫描
May 15 MySQL
MySQL的表级锁,行级锁,排它锁和共享锁
Jul 15 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
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
用Zend Encode编写开发PHP程序
2006/10/09 PHP
PHP日期时间函数的高级应用技巧
2009/05/16 PHP
基于Zend的Config机制的应用分析
2013/05/02 PHP
php中JSON的使用与转换
2015/01/14 PHP
PHP结合Vue实现滚动底部加载效果
2017/12/17 PHP
Javascript - HTML的request类
2007/01/09 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
Extjs4 Treegrid 使用心得分享(经验篇)
2013/07/01 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
javascript实现密码验证
2015/11/10 Javascript
JavaScript的History API使搜索引擎抓取AJAX内容
2015/12/07 Javascript
微信小程序 for 循环详解
2016/10/09 Javascript
概述如何实现一个简单的浏览器端js模块加载器
2016/12/07 Javascript
深入理解Javascript箭头函数中的this
2017/02/13 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
2017/02/19 Javascript
基于Bootstrap框架实现图片切换
2017/03/10 Javascript
浅谈angularjs中响应回车事件
2017/04/24 Javascript
ReactNative之FlatList的具体使用方法
2017/11/29 Javascript
[51:07]VGJ.S vs Pain 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
Python实现TCP协议下的端口映射功能的脚本程序示例
2016/06/14 Python
Java编程迭代地删除文件夹及其下的所有文件实例
2018/02/10 Python
numpy 进行数组拼接,分别在行和列上合并的实例
2018/05/08 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
自学python的建议和周期预算
2019/01/30 Python
pycharm创建一个python包方法图解
2019/04/10 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
台湾旅游网站:灿星旅游
2018/10/11 全球购物
女士鞋子、包包和服装在线,第一款10美元:ShoeDazzle
2019/07/26 全球购物
Android面试宝典
2013/08/06 面试题
大学生创业计划书的用途
2014/01/08 职场文书
国庆节演讲稿
2014/05/27 职场文书
珠宝的促销活动方案
2014/08/31 职场文书
旷课检讨书500字
2014/10/14 职场文书
《比尾巴》教学反思
2016/02/24 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang
SQL Server中使用表变量和临时表
2022/05/20 SQL Server