-
题目
-
sql建表语句:
-
Create table If Not Exists Logs (log_id int); Truncate table Logs; insert into Logs (log_id) values ('1'); insert into Logs (log_id) values ('2'); insert into Logs (log_id) values ('3'); insert into Logs (log_id) values ('7'); insert into Logs (log_id) values ('8'); insert into Logs (log_id) values ('10');
-
分析:根据题目,我们可以先按照数字进行排序,然后求出差值来比较,如果差值相同,就证明这几个数字连续,然后按照差值进行分组,找出每个分组中的最大值和最小值来作为结束和开始的数字,这里的排序要用窗口函数中的row_number()来进行排序,图表分析如下:
-
sql实现:
-
with t1 as (select log_id,row_number() over (order by log_id) rn from Logs -- 按照大小排序 ),t2 as (select log_id,rn,log_id-rn rn2 from t1 -- 算出差值) select distinct min(log_id) over(partition by rn2) start_id,max(log_id) over(partition by rn2) end_id from t2 -- 按照差值分组,取出最小值和最大值作为开始数字和结束数字,然后去重
-
pandas分析和sql分析基本上一样
-
pandas实现:
-
import pandas as pddef find_continuous_ranges(logs: pd.DataFrame) -> pd.DataFrame:logs['rn']=logs['log_id'].rank(ascending=True) -- 排序logs['rn2']=logs['log_id']-logs['rn'] -- 算出差值logs['start_id']=logs.groupby(['rn2'])['log_id'].transform('min') -- 算出最小值logs['end_id']=logs.groupby(['rn2'])['log_id'].transform('max')-- 算出最大值 logs=logs[['start_id','end_id']].drop_duplicates() -- 然后去重return logs
-
说明一下这里使用transform('min')而不使用min(),是因为前者更像咱们sql中的窗口函数,而后者会出现一个小bug,当全部都是不连续的时候就会返回空值,因此这里使用transform('min')。
力扣之1285.找到连续区间的开始和结束
2025/1/8 15:04:05
来源:https://blog.csdn.net/qq_46038718/article/details/142695786
浏览:
次
关键词:力扣之1285.找到连续区间的开始和结束
版权声明:
本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。
我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com
热文排行
- 本周后半段,北方将遭今春首场沙尘天气
- 编程-设计模式 6:适配器模式
- 2024年全国青少年信息素养python编程复赛真题+答案
- 如何利用大数据技术来识别和预防网络赌博行为?
- LLMs之Llama 3.1:Llama 3.1的简介、安装和使用方法、案例应用之详细攻略
- JVM:SpringBoot TomcatEmbeddedWebappClassLoader
- No module named ‘tvtk.custom.light‘ mayavi
- 解决 Ubuntu 系统中 “Temporary Failure in Name Resolution“ 错误
- YOLOv10有效涨点专栏目录
- 开普勒优化算法( KOA)及其Python和MATLAB实现