赞
踩
一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
目录
KISS原则(Keep It Simple, Stupid):
YAGNI原则(You Ain't Gonna Need It):
题目链接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=994805260990660608&page=0
- n=int(input())
- player_scores=[]
- for i in range(n):
- player_score=input().split()
- player_score[1]=int(player_score[1])
- player_score[2]=int(player_score[2])
- player_scores.append([player_score[0],player_score[1]**2+player_score[2]**2])
-
- ranking=sorted(player_scores,key=lambda x: x[1])
- print(f"{ranking[0][0]} {ranking[-1][0]}")
这段代码实现了射击比赛的排名功能,根据输入的运动员编号和射击坐标,计算每个运动员的得分(距离靶心的平方和),然后对运动员进行排序,最后输出得分最低(冠军)和最高(菜鸟)的运动员编号。
总时间复杂度为 O(n + n log n),即 O(n log n)。
总空间复杂度为 O(n)。
这段代码有效地解决了射击比赛的排名问题,时间复杂度主要受排序操作影响,为 O(n log n),空间复杂度为 O(n)。代码结构清晰,逻辑简单,适合处理中小规模的数据集。对于大规模数据集,可能需要考虑更高效的排序算法或数据结构来优化性能。
为了优化时间复杂度和空间复杂度,我们可以考虑以下几点:
下面是优化后的代码:
- # 读取运动员数量
- n = int(input())
-
- # 初始化字典存储运动员信息
- player_scores = {}
-
- # 读取每个运动员的信息并计算得分
- for _ in range(n):
- # 读取一行输入,分割成列表
- player_info = input().split()
- # 运动员编号
- player_id = player_info[0]
- # 射击坐标
- x, y = map(int, player_info[1:])
- # 计算得分(距离的平方和)
- score = x**2 + y**2
- # 存储到字典中
- player_scores[player_id] = score
-
- # 找到得分最小的运动员
- min_score_player = min(player_scores, key=player_scores.get)
- # 找到得分最大的运动员
- max_score_player = max(player_scores, key=player_scores.get)
-
- # 输出结果
- print(f"{min_score_player} {max_score_player}")
总时间复杂度为 O(n)。
总空间复杂度为 O(n)。
这段优化后的代码避免了不必要的排序操作,使用字典来存储和快速查找运动员信息,有效地减少了时间复杂度和空间复杂度。时间复杂度从 O(n log n) 降低到 O(n),空间复杂度保持为 O(n)。这种优化特别适用于处理大规模数据集,可以显著提高程序的执行效率。
优化这段代码所使用的方法体现了以下哲学和编程思想:
通过这些哲学和编程思想的应用,能够编写出既高效又易于理解的代码,这是软件开发中的一个重要目标。
基于上述哲学和编程思想,以下是一些实用的技巧和建议,可以帮助在编程中举一反三:
通过应用这些技巧和建议,可以在编程中更加灵活和高效,同时也能够提升代码的质量和可维护性。记住,编程是一个不断学习和实践的过程,不断挑战自己,尝试新的方法和技巧,将有助于成为一个更好的程序员。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。