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部分操作
Apr 05 MySQL
MySQL 重写查询语句的三种策略
May 10 MySQL
MySQL 视图(View)原理解析
May 19 MySQL
MySQL 百万级数据的4种查询优化方式
Jun 07 MySQL
mysql备份策略的实现(全量备份+增量备份)
Jul 07 MySQL
mysql中整数数据类型tinyint详解
Dec 06 MySQL
排查MySQL生产环境索引没有效果
Apr 11 MySQL
MySQL创建管理KEY分区
Apr 13 MySQL
mysql 获取相邻数据项
May 11 MySQL
MySQL解决Navicat设置默认字符串时的报错问题
Jun 16 MySQL
MySQL transaction事务安全示例讲解
Jun 21 MySQL
MySql统计函数COUNT的具体使用详解
Aug 14 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
yii2中添加验证码的实现方法
2016/01/09 PHP
php 多继承的几种常见实现方法示例
2019/11/18 PHP
JavaScript关于select的相关操作说明
2010/01/13 Javascript
jquery控制listbox中项的移动并排序的实现代码
2010/09/28 Javascript
JS获取鼠标坐标的实例方法
2013/07/18 Javascript
Javascript页面添加到收藏夹的简单方法
2013/08/07 Javascript
jQuery实现鼠标划过展示大图的方法
2015/03/09 Javascript
jQuery插件实现控制网页元素动态居中显示
2015/03/24 Javascript
JS组件Bootstrap实现弹出框和提示框效果代码
2015/12/08 Javascript
jQuery 实现评论等级好评差评特效
2016/05/06 Javascript
jquery 动态增加删除行的简单实例(推荐)
2016/10/12 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
详解如何在NodeJS项目中优雅的使用ES6
2017/04/22 NodeJs
NodeJs安装npm包一直失败的解决方法
2017/04/28 NodeJs
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
Vue学习笔记进阶篇之单元素过度
2017/07/19 Javascript
Angularjs中数据绑定的实例详解
2017/08/25 Javascript
详解vue 计算属性与方法跟侦听器区别(面试考点)
2018/04/23 Javascript
vue中使用element-ui进行表单验证的实例代码
2018/06/22 Javascript
菊花转动的jquery加载动画效果
2018/08/19 jQuery
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
[06:16]DOTA2守卫传承者——职业选手谈心路历程
2015/02/26 DOTA
python实现封装得到virustotal扫描结果
2014/10/05 Python
python实现连接mongodb的方法
2015/05/08 Python
对python tkinter窗口弹出置顶的方法详解
2019/06/14 Python
Python类成员继承重写的实现
2020/09/16 Python
Python中Pyspider爬虫框架的基本使用详解
2021/01/27 Python
澳大利亚领先的睡衣品牌:Peter Alexander
2016/08/16 全球购物
吉列剃须刀英国官网:Gillette英国
2019/03/28 全球购物
艺术设计专业个人求职信范文
2013/12/11 职场文书
人力资源主管岗位职责
2014/01/29 职场文书
2014年党的群众路线教育实践活动整改措施(个人版)
2014/09/25 职场文书
2015大学生暑期实习报告
2015/07/13 职场文书
2015年评职称个人工作总结
2015/10/15 职场文书
创业计划书之DIY自助厨房
2019/09/06 职场文书
德劲DE1102数字调谐收音机机评
2022/04/07 无线电