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

力扣601 体育馆的人流量

        在解决"连续三天及以上人流量超过100的记录"问题时,MySQL方案作为力扣解决问题的方案通过窗口函数和分组技巧高效地识别连续记录。而Python与Pandas方案作为扩展则展示了在数据处理和分析方面的灵活性,通过行号变换和分组计数来筛选符合条件的数据行。

目录

题目描述

解题思路

完整代码

使用python- pandas扩展


题目描述

表:Stadium

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| id            | int     |
| visit_date    | date    |
| people        | int     |
+---------------+---------+
visit_date 是该表中具有唯一值的列。
每日人流量信息被记录在这三列信息中:序号 (id)、日期 (visit_date)、 人流量 (people)
每天只有一行记录,日期随着 id 的增加而增加

编写解决方案找出每行的人数大于或等于 100 且 id 连续的三行或更多行记录。

返回按 visit_date 升序排列 的结果表。

查询结果格式如下所示。

示例 1:

输入:
Stadium 表:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 1    | 2017-01-01 | 10        |
| 2    | 2017-01-02 | 109       |
| 3    | 2017-01-03 | 150       |
| 4    | 2017-01-04 | 99        |
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
输出:
+------+------------+-----------+
| id   | visit_date | people    |
+------+------------+-----------+
| 5    | 2017-01-05 | 145       |
| 6    | 2017-01-06 | 1455      |
| 7    | 2017-01-07 | 199       |
| 8    | 2017-01-09 | 188       |
+------+------------+-----------+
解释:
id 为 5、6、7、8 的四行 id 连续,并且每行都有 >= 100 的人数记录。
请注意,即使第 7 行和第 8 行的 visit_date 不是连续的,输出也应当包含第 8 行,因为我们只需要考虑 id 连续的记录。
不输出 id 为 2 和 3 的行,因为至少需要三条 id 连续的记录。

解题思路

  1. 标记符合条件的行:首先,我们需要找出people大于等于100的行。
  2. 寻找连续的行:接着,我们需要找出这些行中id连续的部分。这一步稍微复杂,因为我们需要检查每行的id是否与前一行的id相差1。
  3. 统计连续行的数量:为了确保连续行至少有三行,我们可以使用窗口函数(如ROW_NUMBER())来为这些连续行分组,并计算每组中的行数。
  4. 筛选结果:最后,我们只保留那些组内行数大于等于3的行。

完整代码

WITH RankedStadium AS (SELECT id, visit_date, people,-- 为连续的行分配相同的组号id - ROW_NUMBER() OVER (ORDER BY id) AS grpFROM StadiumWHERE people >= 100
),
GroupedStadium AS (SELECTid,visit_date,people,grp,-- 计算每个组内的行数COUNT(*) OVER (PARTITION BY grp) AS cntFROMRankedStadium
)-- 选择那些组内行数大于等于3的记录
SELECT id, visit_date, people
FROM GroupedStadium
WHERE cnt >= 3
ORDER BY visit_date;

        这段代码通过WITH语句先创建了一个临时的RankedStadium视图来找出人数大于等于100的行,并为连续的行分配相同的组号。然后在GroupedStadium视图中,它计算每个组内的行数。最后,它选择那些组内行数大于等于3的记录,并按visit_date排序。这样就能找到至少有三行连续idpeople大于等于100的记录。

通过

使用python- pandas扩展

  1. 筛选符合条件的行:首先,我们需要筛选出people字段大于等于100的行。
  2. 寻找连续的行:然后,我们需要找到id连续的行。由于id是连续增加的,我们可以通过检查当前行的id是否比前一行的id大1来判断是否连续。
  3. 标记连续的组:为了识别连续的行,我们可以用id减去行号来为每个连续的块创建一个唯一的标识符。
  4. 统计每组的行数:通过分组并统计每个组的行数,我们可以找出至少包含3行的组。
  5. 筛选结果:最后,我们筛选出那些组内行数大于等于3的行。
import pandas as pd# 假设stadium_df是包含Stadium表数据的DataFrame
stadium_df = pd.DataFrame({'id': [1, 2, 3, 4, 5, 6, 7, 8],'visit_date': ['2017-01-01', '2017-01-02', '2017-01-03', '2017-01-04', '2017-01-05', '2017-01-06', '2017-01-07', '2017-01-09'],'people': [10, 109, 150, 99, 145, 1455, 199, 188]
})# 筛选people大于等于100的行
filtered_df = stadium_df[stadium_df['people'] >= 100]# 通过id减去行号创建组标识符
filtered_df['group'] = filtered_df['id'] - filtered_df.reset_index().index# 计算每组的行数
group_counts = filtered_df.groupby('group').size()# 筛选出组内行数大于等于3的组
valid_groups = group_counts[group_counts >= 3].index# 最终结果
result_df = filtered_df[filtered_df['group'].isin(valid_groups)].drop('group', axis=1)print(result_df)

http://www.lryc.cn/news/309335.html

相关文章:

  • ubuntu20.04设置docker容器开机自启动
  • Kubernetes/k8s的核心概念
  • vue 前端预览 Excel 表
  • 【JS】生成N位随机数
  • 2024年FPGA可以进吗
  • 小程序图形:echarts-weixin 入门使用
  • 百度百科人物创建要求是什么?
  • 练习2-线性回归迭代(李沐函数简要解析)
  • 人像背景分割SDK,智能图像处理
  • 100M服务器能同时容纳多少人访问
  • Mysql 的高可用详解
  • Acwing枚举、模拟与排序(一)
  • MySQL的主从同步原理
  • naive-ui-admin 表格去掉工具栏toolbar
  • C++之结构体
  • 分布式ID选型对比(1)
  • T-SQL 高阶语法之存储过程
  • 解决鸿蒙模拟器卡顿的问题
  • 【LeetCode每日一题】【BFS模版与例题】863.二叉树中所有距离为 K 的结点
  • 设计模式-结构模式-装饰模式
  • MySQL:一行记录如何
  • ‘grafana.ini‘ is read only ‘defaults.ini‘ is read only
  • 博途PLC 面向对象系列之“输送带控制功能块“(SCL代码)
  • 2024-02学习笔记
  • 最新消息:英特尔宣布成立全新独立运营的FPGA公司——Altera
  • RC正弦波振荡电路
  • 【Git学习笔记】提交PR
  • 线程池的相关参数
  • 图书推荐||Word文稿之美
  • 前端导出word文件的多种方式、前端导出excel文件