问题描述
在小C的班级里,有 N 个学生,每个学生的成绩是 A_i。小C发现了一件有趣的事:当且仅当某个学生的成绩小于或等于自己的有更多人时,这个学生会说谎。换句话说,如果分数小于等于他的学生数量大于比他分数高的学生数量,则他会说谎。
现在,小C想知道班里有多少个学生会说谎。
解题思路
通过遍历班级中每个学生的成绩,针对每个成绩分别计算出成绩小于等于该成绩的学生数量以及成绩高于该成绩的学生数量。然后根据题目给定的说谎条件(成绩小于等于自己的学生数量大于比自己分数高的学生数量)来判断该学生是否说谎,最后统计说谎学生的总数。
我们先自定义一个函数solution,用于计算给定成绩列表 A 中说谎的学生数量。获取学生成绩列表 A的长度n,也就是学生的数量。
然后初始化一个变量 liar_count,用于记录说谎的学生数量,初始值为 0。然后遍历成绩列表A中的每个成绩 score,通过一个生成式表达式和sum函数,,计算成绩列表A中成绩小于等于当前遍历到的成绩score的学生数量。遍历成绩列表 A 中的每一个元素 x,当 x 小于等于当前遍历到的 score 时,就累加 1,这样就得到了成绩小于等于该学生成绩的学生数量。由于班级学生总数是 n,那么成绩高于该学生成绩的学生数量 greater_count 就可以通过用学生总数 n 减去成绩小于等于该学生成绩的学生数量 less_equal_count 得到。判断学生是否说谎的依据是:当成绩小于等于该学生成绩的学生数量大于成绩高于该学生成绩的学生数量时,该学生被认为是说谎。
def solution(A):
n = len(A)
liar_count = 0
for score in A:
less_equal_count = sum(1 for x in A if x <= score)
greater_count = n - less_equal_count
if less_equal_count > greater_count:
liar_count += 1
return liar_count
if __name__ == "__main__":
# 测试用例
print(solution([100, 100, 100]) == 3) # 输出: True
print(solution([2, 1, 3]) == 2) # 输出: True
print(solution([30, 1, 30, 30]) == 3) # 输出: True
print(solution([19, 27, 73, 55, 88]) == 3) # 输出: True
print(solution([19, 27, 73, 55, 88, 88, 2, 17, 22]) == 5) # 输出: True
其中,if __name__ == "__main__":是 Python 中常见的主程序入口判断语句。当脚本直接运行时,__name__的值为__main__,此时会执行下面的测试用例验证代码;当脚本作为模块被导入到其他程序中时,__name__的值为模块名,不会执行测试用例来验证代码。
MarsCode 代码优化
使用内置函数 bisect 优化查找小于等于当前成绩的学生数量:
使用 Python 的 bisect 模块来优化查找成绩小于等于当前成绩的学生数量的过程。bisect 模块提供了用于在有序序列中进行二分查找和插入操作的函数。
这里对输入的成绩列表A进行了一个排序的操作,得到一个有序的成绩列表sorted_scores,less_equal_count = bisect.bisect_right(sorted_scores, score):使用 bisect.bisect_right 函数在已经排序好的成绩列表 sorted_scores 中查找 score 应该插入的位置。bisect_right 函数的特点是返回的插入位置是在所有相等元素之后,所以这个返回值实际上就是成绩小于等于 score 的学生数量(包括 score 本身)。通过这种方式,利用二分查找的高效性,能够快速准确地得到成绩小于等于当前成绩的学生数量,相比于之前逐个比较的方式,大大提高了查找效率和我们的工作效率。
代码展示:
import bisect
def solution(A):
n = len(A)
sorted_scores = sorted(A)
liar_count = 0
for score in A:
less_equal_count = bisect.bisect_right(sorted_scores, score)
greater_count = n - less_equal_count
if less_equal_count > greater_count:
liar_count += 1
return liar_count
综上,通过使用 bisect 模块来优化查找成绩小于等于当前成绩的学生数量的过程,代码在处理较大规模的成绩列表时,能够更快速、准确地计算出说谎学生的数量。
以前刷题当遇到错题,往往需要花费大量的时间自行分析错误原因或求助等待老师、同学的讲解。而 AI 刷题能够在我提交答案后立即给出反馈,Ai Fix 不仅指出答案的对错,还详细分析错误的根源,并进行检查与修正,或伪代码思路提示,这种启发式的引导让我学会如何自主地解决问题,培养了我的思维能力和解题技巧,在学习过程中发挥了重要作用。