当前位置: 首页 > news >正文

单挑力扣(LeetCode)SQL题:180. 连续出现的数字(难度:中等)

题目:180. 连续出现的数字

(通过次数124,862 | 提交次数258,838,通过率48.24%)

表:Logs
+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| id          | int     |
| num         | varchar |
+-------------+---------+
id 是这个表的主键。

编写一个 SQL 查询,查找所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
查询结果格式如下面的例子所示:

示例 1:
输入:
Logs 表:
+----+-----+
| Id | Num |
+----+-----+
| 1  | 1   |
| 2  | 1   |
| 3  | 1   |
| 4  | 2   |
| 5  | 1   |
| 6  | 2   |
| 7  | 2   |
+----+-----+
输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+
解释:1 是唯一连续出现至少三次的数字。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/consecutive-numbers

#测试数据
Create table If Not Exists Logs (id int, num int);

insert into Logs (id, num) values ('1', '1');
insert into Logs (id, num) values ('2', '1');
insert into Logs (id, num) values ('3', '1');
insert into Logs (id, num) values ('4', '2');
insert into Logs (id, num) values ('5', '1');
insert into Logs (id, num) values ('6', '2');

解题思路:

这又是一个求连续次数及连续区间的问题。

在单挑力扣(LeetCode)SQL题:1285. 找到连续区间的开始和结束数字(难度:中等)中,我提到,连续区间一般有以下3个特性:

第一种特性:一个有序的集市,错位相减,可以得到区间的开始值和结束值;

第二种特性:如果一个数字是一个区间的开始值,那么这个数字-1一定不在集合中;相应的,如果一个数字是一个区间的结束值,那么这个数字+1一定不在集合中;

第三种特性:一个有序的集合,如果某几个值是连续的,那么这几个值-它的序号一定是相同的;

因为本次判断是否连续的要求是:连续相同的值。那么,如果基于第三种特性直接计算,是不行的。

我们可以使用开窗函数,在组内构建一个序号,这样就可以保证“值-它的序号”是相同的了。

下面参考SQL的方法二,就是基于这种特性。

当然,我们也可以基于第二种特性,计算出每个区间的开始值和结束值,然后再计算出连续的个数。

下面参考SQL的方法一,就是基于这种特性。

参考SQL:


#方法1
select
    distinct b.num ConsecutiveNums
from (
    select  
        a.num,
        (row_number() over (order by a.id asc) - 
        row_number() over (partition by a.num order by a.id asc)) as series_id
    from logs a
) b
group by b.num, b.series_id
having count(1) >= 3;

#方法2
with tmp as (
select 
    a.id,a.num,
    row_number() over(order by a.id) rn
from Logs a
where (a.id,a.num) not in (select b.id+1,b.num from Logs b)
or (a.id,a.num) not in (select c.id-1,c.num from Logs c)
)
select
    a.num ConsecutiveNums
from tmp a
inner join tmp b
on a.rn = b.rn-1
and a.num = b.num
and b.id - a.id >=2
group by a.num;

相关文章:

  • 用idea跑起十多年前的项目
  • PHP序列化总结3--反序列化的简单利用及案例分析
  • Linux系统:引导过程与服务控制
  • 深入理解ArkTS:Harmony OS 应用开发语言 TypeScript 的基础语法和关键特性
  • [C语言]时间戳
  • Unity3D Shader Graph 使用 DDXY 节点达到抗锯齿的原理详解
  • 【量化】蜘蛛网策略复现
  • uniapp原生插件 - android原生插件打包流程 ( 避坑指南一)
  • QML —— Tcp网络通信实例(qml前端,C++后端。附完整源码)
  • 【Spark精讲】SparkSQL的RBO与CBO
  • Java 已死、前端已凉?
  • 0基础学java-day24(MySQL)
  • 使用 Jackson 提取 JSON 数据值 - JsonUtils工具类
  • 14.2 并发与竞争实验
  • HarmonyOS应用开发者高级认证(88分答案)
  • 基于深度卷积神经网络的猴痘分类识别系统
  • vfb控件数组的实现原理(visual freebasic ide),64位VB6 vb7
  • electron + sqlite3 解决打包后无法写入数据库
  • 用RASP五步轻松保护云端无服务器架构
  • Redis的集群模式:主从 哨兵 分片集群
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开“无条件谈判”
  • 中国驻美大使:远离故土的子弹库帛书正随民族复兴踏上归途
  • 上百家单位展示AI+教育的实践与成果,上海教育博览会开幕
  • 温州通报“一母亲殴打女儿致其死亡”:嫌犯已被刑拘
  • 湃书单|澎湃新闻编辑们在读的14本书:后工作时代
  • 商务部:中方敦促美方尽快停止232关税措施