【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 天,希望每天都能见到最棒的你🏅
🌲🌲🌲 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~
- 点赞
- 收藏
- 关注作者
评论(0)