【Python训练营】Python每日一练----第30天:日志统计

举报
是Dream呀 发表于 2022/02/26 11:48:50 2022/02/26
【摘要】 【Python训练营】Python每日一练----第30天:日志统计

在这里插入图片描述

📢📢📢📣📣📣
🌻🌻🌻Hello,大家好我叫是Dream呀,一个有趣的Python博主,多多关照😜😜😜
🏅🏅🏅2021年度博客之星TOP100,2021年度博客之星领域TOP5,Python领域优质创作者,欢迎大家找我合作学习(文末有VX 想进学习交流群or学习资料 欢迎+++)
💕入门须知:这片乐园从不缺乏天才,努力才是你的最终入场券!🚀🚀🚀
💓最后,愿我们都能在看不到的地方闪闪发光,一起加油进步🍺🍺🍺
🍉🍉🍉“一万次悲伤,依然会有Dream,我一直在最温暖的地方等你”,唱的就是我!哈哈哈~🌈🌈🌈
🌟🌟🌟✨✨✨

题目描述

题目描述
小明维护着一个程序员论坛。现在他收集了一份"点赞"日志,日志共有 N 行。其中每一行的格式是:
ts id
表示在 ts 时刻编号 id 的帖子收到一个"赞"。
现在小明想统计有哪些帖子曾经是"热帖"。如果一个帖子曾在任意一个长度为 D 的时间段内收到不少于 K 个赞,小明就认为这个帖子曾是"热帖"。

具体来说,如果存在某个时刻 T 满足该帖在 [T,T+D)这段时间内(注意是左闭右开区间)收到不少于 K 个赞,该帖就曾是"热帖"。
给定日志,请你帮助小明统计出所有曾是"热帖"的帖子编号。

输入描述
输入格式:
第一行包含三个整数 N,D,K。
以下 N 行每行一条日志,包含两个整数 ts 和 id。

输出描述
按从小到大的顺序输出热帖 idid。每个 idid 一行。

输入输出样例
示例

输入
7 10 2
0 1
0 10
10 10
10 1
9 1
100 3
100 3

输出
1
3
运行限制
最大运行时间:1s
最大运行内存: 256M

解题思路

  • 首先输入时我们选用map函数进行多个元素赋值输入,在换行输入ts以及id的时候我们可以选用range函数进行换行,之后再选用map函数进行两个元素的赋值输入;
  • 在输入ts以及id之后,我们将其以元素的形式放入事先准备好的列表中去list1.append((id,ts))这里注意我们列表中的元素元组第一个数是我们的id,便于我们的列表排序,按照id的大小排序有利于我们下一步的计算
  • 接着设置两个变量ed和社团,第一个代表我们找定的id接下来依次遍历的元素,另一个表示我们一个id遍历结束后进行遍历的另一个id,初始时都定义为0,这里要确保每次循环遍历结束后他两个的值都一样,这样便于我们理解接下来的每一次while循环
  • 因为列表元素是按顺序进行排列的,所以说如果属于同一个id,排列顺序肯定是依次相连的,而他们后一项的时间也是如此,所以我们就可以简单方便的从头开始依次进行遍历;同时如果符合条件ed进行ed += 1
  • 在遍历完一个id之后此时我们的ed是有变化的,他的值就是符合时间限制之后的前一个id的最大出现的K的次数。此时令st=ed之后,再进行st的遍历找值这样会方便很多;
  • 结束st的取值之后,一定要让st = ed,这样就会和刚开始一样重复之前找值的过程,也便于我们理解。

源码分享

# Time    : 2022/2/25 22:02
# File    : 日志统计.py
# Author  : 是Dream呀!

# 一万次悲伤,依然会有Dream,我一直在最温暖的地方等你!
a, b, c = map(int,input().split())
list1 = []
for i in range(a):
    ts, id = map(int,input().split())
    list1.append((id,ts))  # 这里注意我们列表中的元素元组第一个数是我们的id,便于我们的列表排序,按照id的大小排序有利于我们下一步的计算
# print(list1)  # [(0, 1), (0, 10), (10, 10), (10, 1), (9, 1), (100, 3), (100, 3)]
list1.sort()
# print(list1)  # [(1, 0), (1, 9), (1, 10), (3, 100), (3, 100), (10, 0), (10, 10)]
ed, st = 0, 0  # 设置两个变量,第一个代表我们找定的id接下来依次遍历的元素,另一个表示我们一个id遍历结束后进行遍历的另一个id
while st < a:
    # 因为列表元素是按顺序进行排列的,所以说如果属于同一个id,排列顺序肯定是依次相连的,而他们后一项的时间也是如此
    while ed < a and list1[ed][0] == list1[st][0] and list1[ed][1]-list1[st][1] < b:
        # while循环找到相同的id符合规定时间内的个数
        ed += 1
    if ed - st >= c:              
        print(list1[st][0])
        st = ed
        # while循环找出下一个我们要进行遍历的id
        while st < a and list1[st][0] == list1[st-1][0]:
            st += 1
        # 此时ed = st进行下一个id的循环遍历
        ed = st
    else:
        st += 1
        ed = st

学习总结

1.range + map函数进行多行输入我们的值:

for i in range(a):
    ts, id = map(int,input().split())

🏅今天是我在Python训练营的第 30 天,希望每天都能见到最棒的你🏅

🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
在这里插入图片描述
在这里插入图片描述

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。