题目解析
问题描述
在一个班级中,有 N 个学生,每个学生的成绩是 A_i。当一个学生的成绩小于或等于自己的学生数量多于比自己分数高的学生数量时,这个学生会说谎。现在,需要统计班里有多少个学生会说谎。
解题思路
-
统计分数段人数:
- 使用一个数组或哈希表统计每个分数段有多少学生。
-
遍历每个学生:
- 对于每个学生,根据其分数,计算分数小于等于他的学生数量和分数高于他的学生数量。
- 判断是否满足说谎条件。
-
结果统计:
- 统计满足说谎条件的学生数量。
图解
假设班级有 5 个学生,成绩分别为 [3, 1, 3, 2, 4]。
-
统计分数段人数:
- 分数 1: 1 人
- 分数 2: 1 人
- 分数 3: 2 人
- 分数 4: 1 人
-
遍历每个学生:
- 学生 1(分数 1):小于等于他的学生有 1 人,高于他的学生有 4 人,不满足说谎条件。
- 学生 2(分数 3):小于等于他的学生有 3 人,高于他的学生有 2 人,满足说谎条件。
- 学生 3(分数 3):小于等于他的学生有 3 人,高于他的学生有 2 人,满足说谎条件。
- 学生 4(分数 2):小于等于他的学生有 2 人,高于他的学生有 3 人,不满足说谎条件。
- 学生 5(分数 4):小于等于他的学生有 4 人,高于他的学生有 1 人,不满足说谎条件。
-
结果:有 2 个学生会说谎。
代码详解
def count_liars(scores):
n = len(scores)
score_count = {}
# 统计每个分数段的学生数量
for score in scores:
if score not in score_count:
score_count[score] = 0
score_count[score] += 1
liar_count = 0
sorted_scores = sorted(score_count.keys())
# 遍历每个学生分数
for i, score in enumerate(sorted_scores):
# 小于等于当前分数的学生数量
leq_count = sum(score_count[s] for s in sorted_scores if s <= score)
# 大于当前分数的学生数量
gt_count = sum(score_count[s] for s in sorted_scores[i+1:])
if leq_count > gt_count:
liar_count += score_count[score]
return liar_count
# 示例
scores = [3, 1, 3, 2, 4]
print(count_liars(scores)) # 输出: 2
知识总结
- 哈希表统计:使用哈希表可以高效地统计每个分数段的学生数量。
- 排序与遍历:通过排序分数段,可以方便地计算小于等于和大于某个分数的学生数量。
- 条件判断:根据题目条件,正确地进行逻辑判断。
理解:
- 本题的关键在于利用哈希表进行高效的统计,并通过排序简化计算过程。
- 需要注意边界条件,例如当所有学生的分数都相同时的处理。
学习建议:
- 熟练掌握哈希表的使用,了解其时间复杂度。
- 多练习排序和遍历相关题目,提升算法思维。
学习计划
-
制定刷题计划:
- 每天至少刷 10 道算法题,涵盖不同难度和知识点。
- 每周对错题进行复盘,总结错误原因和解决方法。
-
利用错题针对性学习:
- 将错题分类,针对不同类型的问题进行专项训练。
- 查阅相关算法和数据结构的资料,加深理解。
-
定期总结:
- 每周写一篇学习笔记,总结本周学习的知识点和心得。
- 每月进行一次全面复习,巩固所学知识。
工具运用
-
豆包MarsCode AI 刷题功能:
- 利用 AI 提供的题目解析和代码示例,快速理解题目解法。
- 通过 AI 的错题分析,找出自己的薄弱环节,进行针对性训练。
-
结合其他学习资源:
- 查阅算法和数据结构的经典书籍,如《算法导论》等。
- 参加在线课程,如 LeetCode、MOOC 等,提升算法能力。
- 加入算法学习社群,与其他学习者交流心得和经验。
实用学习建议:
- 多动手实践,不要只看题目解析,要自己动手编写代码。
- 善于利用学习资源,结合多种途径提升学习效果。
- 保持耐心和毅力,算法学习需要时间和积累。