LeetCode:180.连续出现的数字
题目
编写一个 SQL 查询,查找所有至少连续出现三次的数字。
+----+-----+
| Id | Num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解答
先总结方法:
- 使用自连接,3个表连接;(如果连续出现1000次,这个方法就不行了。。)
- 使用
oracle窗口函数; - 使用
MySQL变量的方式;
一开始看的时候,毫无头绪。。
解法一
粗略的看了下解答,用自连接的方法,尝试了下,居然通过了。
---- oracle ----
/* Write your PL/SQL query statement below */
select distinct a.Num as ConsecutiveNums
from Logs a,
Logs b,
Logs c
where a.Id = b.Id + 1
and a.Id = c.Id + 2
and a.Num = b.Num
and a.Num = c.Num --- 806ms
考虑如果 id 不连续出现的情况,则需要在数据表中插入一列新的 id 自增数据进行标识。
解法二
由于要获取至少连续3次出现的数字,看到这个题肯定是会变的,如果是至少连续出现4次(100次),连接4个表(连接1000个)?这种方法肯定是不可取的。
找规律,找出这连续起来的数字有什么规律呢?发现连续的数字是相同的数字,但是id有可能不是连续的,我们就需要通过对结果集进行再次编号,让其变成连续的。
首先我们获取到对每条数据编号从1开始使用
row_number()函数使用id来排序。然后我们通过另一种方式排序将这些
num值一样的进行排序,然后对其编号同样使用row_bumber()使用num来分组使用id排序over(partition by num order by id)通过3、4步骤,两个相减之后我们可以得到,只要是相等的,则相减的值是一样的。而且如果不连续的话相减值也不一样。
最后再通过
num和rn两个共同分组找到一样的一共有几个,就可以找到连续的了。
最终代码为:
---- oracle ----
/* Write your PL/SQL query statement below */
select distinct Num as ConsecutiveNums
from
(
select Num,
rn,
count(Id) as cnt
from
(
select Id,
Num,
row_number() over(order by id) - row_number() over(partition by num order by id) as rn
from Logs
)
group by Num, rn
)
where cnt >= 3; ---- 1414ms 好慢
想了想,会不会存在 Num + rn 误判的情况?因为一直递增,貌似不会。
解法三
使用2个变量进行统计。
---- MySQL ----
select distinct t.Num as ConsecutiveNums
from
(
select a.Num,
@cnt := if(@pre = a.Num, @cnt + 1, 1) cnt,
@pre := a.Num pre
from Logs a,
(select @pre := null,
@cnt := 0) b
) t
where t.cnt >= 3; ---- 179ms
判断当前Num与上一个Num是否一致,如果是cnt加一,如果不是,重新计数。
高明!
思考
联想到以前自己的一个奇思妙想:赌钱!押大还是押小,买定离手!
- 买1块钱大,赢了的话,继续买;
- 输了的话,买2块钱大;
- 赢了的话,恢复买1块,输了的话,买4块钱大;
- 以此循环
- 设定上限,直到128块就认输,止损。
当时想到这个做法的时候,问自己,如果我有较多的资金的话,假设我有1w,那一直买,买到8192的时候,已经是2的13次方了。。不可能连续输了13次吧。。当时这么想。。
后来,觉得连续开13次小还是有概率的,想用程序随机模拟一下输赢的概率。。但是拖延症上身,一直没有去实践。。
今天这道题,尝试一下吧。。
LeetCode:180.连续出现的数字的更多相关文章
- 180. 连续出现的数字 + MySql + 连续出现数字 + 多表联合查询
180. 连续出现的数字 LeetCode_MySql_180 题目描述 代码实现 # Write your MySQL query statement below select distinct t ...
- sql 180. 连续出现的数字
编写一个 SQL 查询,查找所有至少连续出现三次的数字. +----+-----+| Id | Num |+----+-----+| 1 | 1 || 2 | 1 || 3 | 1 || 4 | 2 ...
- js验证连续两位数字递增或递减和连续三位数字相同
<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8" ...
- LeetCode:至少是其他数字两倍的最大数【747】
LeetCode:至少是其他数字两倍的最大数[747] 题目描述 在一个给定的数组nums中,总是存在一个最大元素 . 查找数组中的最大元素是否至少是数组中每个其他数字的两倍. 如果是,则返回最大元素 ...
- LeetCode数组中重复的数字
LeetCode 数组中重复的数字 题目描述 在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. ...
- [SQL]LeetCode180. 连续出现的数字 | Consecutive Numbers
SQL架构: Create table If Not Exists Logs (Id int, Num int) Truncate table Logs insert into Logs (Id, N ...
- LeetCode 788. Rotated Digits (旋转数字)
X is a good number if after rotating each digit individually by 180 degrees, we get a valid number t ...
- [LeetCode] Lexicographical Numbers 字典顺序的数字
Given an integer n, return 1 - n in lexicographical order. For example, given 13, return: [1,10,11,1 ...
- [LeetCode] Missing Number 丢失的数字
Given an array containing n distinct numbers taken from 0, 1, 2, ..., n, find the one that is missin ...
随机推荐
- CSS3常用属性及效果汇总
本文转载于<https://blog.csdn.net/lyznice/article/details/54575905> 一.2D效果属性 要使用这些属性,我们需要通过 transfor ...
- 【工具】sqlmap 中文手册 使用教程
日期:2019-07-28 09:27:27 更新: 作者:Bay0net 介绍:自己翻译了一下,做个备忘. 0x01. 基本信息 官网 sqlmap: automatic SQL injection ...
- delphi7 treeview + 数据库 实现动态节点维护
首先说下树节点对应的表的基本结构,必需要有的字段(节点编号,父节点编号,节点名称),其他字段根据你开发的需要添加从添加节点开始,一开始就取出表中最大节点编号,每次添加节点的时候,该节点编号增加1;添加 ...
- 查看进程的命令ps
查看进程的命令:ps aux strace -p pid(进程id) 杀死进程:kill pid(进程id)强制杀死进程:kill -9 pid(进程id) linux ps 命令查看进程状态linu ...
- 给mysql创建用户
给mysql 创建用户过程: 1.进入mysql cmd下 2.输入密码:123 3.选择使用的数据库:use myeshop 4.创建新用户grant usage on *.* to 'cctvse ...
- LODOP中用ADD_PRINT_IMAGE缩放非图片超文本
LODOP中HTML,URL,带有img标签的IMAGE,TBALE等打印项都属于超文本.关于LODOP中的纯文本和超文本,可查看本博客相关博文:LODOP中的纯文本和超文本打印项 ADD_PRINT ...
- jenkins:执行远程shell脚本时,脚本没有生效
问题: jenkins远程部署一台机器时,jenkins构建显示成功,但是查看服务日志却没有真正执行的sh run.sh脚本,导致服务并没有启动 解决: 只需要在命令最上方加上source /etc/ ...
- Unity3d 烘培lightingmap 注意的2点.
1.在Qulity里面设置合适的灯光数量.否则,你会发现烘培出来的场景,有些灯光没有起作用. 2.在导入模型时候,注意勾选:Generate Lightingmap . 否则,模型没办法烘培. 3. ...
- 基于Keras 的VGG16神经网络模型的Mnist数据集识别并使用GPU加速
这段话放在前面:之前一种用的Pytorch,用着还挺爽,感觉挺方便的,但是在最近文献的时候,很多实验都是基于Google 的Keras的,所以抽空学了下Keras,学了之后才发现Keras相比Pyto ...
- yso中URLDNS的pop链分析(重新分析整理)
#发现之前对这个链关注的点有点问题,重新分析了一下 由于最近面试的过程中被问到了yso中URLDNS这个pop链的工作原理,当时面试因为是谈到shiro的怎么检测和怎么攻击时谈到了这个.其实在实战中用 ...