欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

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

时间:2023-04-27

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

前言:【Python训练营】是针对Python语言学习所打造的一场刷题狂欢party! 对基础知识把握不牢固的话,欢迎参考此套课程:Python公开课 搭配使用最佳嗷~喜欢的话就抓紧订阅起来吧!如果对学习没有自制力或者没有一起学习交流的动力,欢迎私信或者在文末添加我的VX,我会拉你进学习交流群,我们一起交流学习,报团打卡

Python每日一练:

题目描述解题思路源码分享学习总结往期文章----好文推荐 题目描述

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

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

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

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

输入输出样例
示例

输入7 10 20 10 1010 1010 19 1100 3100 3输出13

运行限制最大运行时间: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呀!# VX : 18300396393# 一万次悲伤,依然会有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遍历结束后进行遍历的另一个idwhile 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 天,希望每天都能见到最棒的你

往期文章----好文推荐

磊 [Python公开课]零基础玩转Python基础篇----第一节:Python的自我介绍

賂 [Python公开课]零基础玩转Python进阶篇----第一节:Python中的文件操作

雷 快来一场一场刷题狂欢的party吧!----【Python训练营】
 好啦,这就是今天要分享给大家的全部内容了
❤️❤️❤️如果你喜欢的话,就不要吝惜你的一键三连了~

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。