【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 天,希望每天都能见到最棒的你?

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

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享