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 11 MySQL
MYSQL数据库使用UTF-8中文编码乱码的解决办法
May 26 MySQL
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
May 29 MySQL
MySQL 常见存储引擎的优劣
Jun 02 MySQL
MySQL系列之十五 MySQL常用配置和性能压力测试
Jul 02 MySQL
一次MySQL启动导致的事故实战记录
Sep 15 MySQL
MYSQL如何查看进程和kill进程
Mar 13 MySQL
Mysql事务索引知识汇总
Mar 17 MySQL
MySQL数据库安装方法与图形化管理工具介绍
May 30 MySQL
MYSQL中文乱码问题的解决方案
Jun 14 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 MySQL
了解MySQL查询语句执行过程(5大组件)
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
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
用javascript实现无刷新更新数据的详细步骤 asp
2006/12/26 Javascript
javascript+dom树型菜单类,希望朋友们一起进步
2007/05/03 Javascript
用jquery实现点击栏目背景色改变
2012/12/10 Javascript
jQuery获取注册信息并提示实现代码
2013/04/21 Javascript
JavaScript日期时间格式化函数分享
2014/05/05 Javascript
JavaScript用JQuery呼叫Server端方法示例代码
2014/09/03 Javascript
JavaScript字符串对象charAt方法入门实例(用于取得指定位置的字符)
2014/10/17 Javascript
JQuery球队选择实例
2015/05/18 Javascript
JavaScript实现选择框按比例拖拉缩放的方法
2015/08/04 Javascript
JavaScript实现倒计时代码段Item1(非常实用)
2015/11/03 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
AngularJS实现路由实例
2017/02/12 Javascript
深入理解JavaScript继承的多种方式和优缺点
2017/05/12 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
2017/08/28 Javascript
使用async-validator编写Form组件的方法
2018/01/10 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
2018/01/21 Javascript
使用javascript函数编写简单银行取钱存钱流程
2018/05/26 Javascript
vue项目中使用eslint+prettier规范与检查代码的方法
2020/01/16 Javascript
javascript 原型与原型链的理解及应用实例分析
2020/02/10 Javascript
Python with的用法
2014/08/22 Python
django使用LDAP验证的方法示例
2018/12/10 Python
Python用input输入列表的实例代码
2020/02/07 Python
解决H5的a标签的download属性下载service上的文件出现跨域问题
2019/07/16 HTML / CSS
解决Firefox下不支持outerHTML问题代码分享
2014/06/04 HTML / CSS
html table呈现个人简历以及单元格宽度失效的问题解决
2021/01/22 HTML / CSS
世界上最大的二手相机店:KEN
2017/05/17 全球购物
工程师自我评价怎么写
2013/09/19 职场文书
社区十八大感言
2014/01/19 职场文书
运动会口号8字
2014/06/07 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
仓管员岗位职责范本
2015/04/01 职场文书
关于法制教育的宣传语
2015/07/13 职场文书
2016学校先进集体事迹材料
2016/02/29 职场文书