统计班级中的说谎者 | 豆包MarsCode AI刷题

94 阅读4分钟

问题描述

在小C的班级里,有 N 个学生,每个学生的成绩是 A_i。小C发现了一件有趣的事:当且仅当某个学生的成绩小于或等于自己的有更多人时,这个学生会说谎。换句话说,如果分数小于等于他的学生数量大于比他分数高的学生数量,则他会说谎。

现在,小C想知道班里有多少个学生会说谎。


测试样例

样例1:

输入:A = [100, 100, 100]
输出:3

样例2:

输入:A = [2, 1, 3]
输出:2

样例3:

输入:A = [30, 1, 30, 30]
输出:3

样例4:

输入:A = [19, 27, 73, 55, 88]
输出:3

样例5:

输入:A = [19, 27, 73, 55, 88, 88, 2, 17, 22]
输出:5

问题理解

我们需要找出班里有多少个学生会说谎。说谎的条件是:某个学生的成绩小于或等于自己的有更多人时,这个学生会说谎。换句话说,如果分数小于等于他的学生数量大于比他分数高的学生数量,则他会说谎。

数据结构选择

我们可以使用一个计数器来统计每个分数出现的次数,这样可以方便地计算每个分数对应的“小于等于”和“大于”的数量。

算法步骤

  1. 统计每个分数的出现次数:使用 Counter 来统计每个分数的出现次数。

  2. 计算每个分数的“小于等于”和“大于”的数量

    • 对于每个分数,计算小于等于该分数的学生数量。
    • 计算大于该分数的学生数量。
  3. 判断是否说谎:如果“小于等于”的数量大于“大于”的数量,则该分数对应的学生会说谎。

  4. 累加说谎的学生数量:根据每个分数的说谎情况,累加说谎的学生数量。

关键点

  • 计数器:使用 Counter 来统计每个分数的出现次数。
  • 遍历:遍历每个分数,计算“小于等于”和“大于”的数量。
  • 判断条件:判断“小于等于”的数量是否大于“大于”的数量。
from collections import Counter

def solution(A):
    num_count = Counter(A)  # 统计每个分数的出现次数
    result = 0  # 初始化说谎的学生数量
    
    for num in num_count:  # 遍历每个分数
        less_equal_count = sum(1 for n in A if n <= num)  # 计算小于等于当前分数的学生数量
        greater_count = len(A) - less_equal_count  # 计算大于当前分数的学生数量
        
        if less_equal_count > greater_count:  # 判断是否说谎
            result += num_count[num]  # 累加说谎的学生数量
    
    return result  # 返回说谎的学生总数

if __name__ == "__main__":
    print(solution([100, 100, 100]) == 3)
    print(solution([2, 1, 3]) == 2)
    print(solution([30, 1, 30, 30]) == 3)
    print(solution([19, 27, 73, 55, 88]) == 3)
    print(solution([19, 27, 73, 55, 88, 88, 2, 17, 22]) == 5)

代码步骤

  1. 导入 Counter
from collections import Counter

使用 Counter 来统计每个分数的出现次数。

  1. 定义 solution 函数
def solution(A):

该函数接受一个列表 A,表示学生的成绩。

  1. 统计每个分数的出现次数
num_count = Counter(A)

使用 Counter 统计每个分数的出现次数,结果存储在 num_count 中。

  1. 初始化说谎的学生数量
result = 0

初始化 result 为 0,用于记录说谎的学生数量。

  1. 遍历每个分数
for num in num_count:

遍历 num_count 中的每个分数 num

  1. 计算小于等于当前分数的学生数量
less_equal_count = sum(1 for n in A if n <= num)

使用生成器表达式计算小于等于 num 的学生数量。

  1. 计算大于当前分数的学生数量
greater_count = len(A) - less_equal_count

通过总学生数量减去小于等于 num 的学生数量,得到大于 num 的学生数量。

  1. 判断是否说谎
if less_equal_count > greater_count:

如果小于等于 num 的学生数量大于大于 num 的学生数量,则该分数对应的学生会说谎。

  1. 累加说谎的学生数量
result += num_count[num]

将说谎的学生数量累加到 result 中。

  1. 返回说谎的学生总数
return result

返回说谎的学生总数。

总结

这段代码通过统计每个分数的出现次数,计算每个分数对应的“小于等于”和“大于”的学生数量,判断是否说谎,并累加说谎的学生数量。最终返回说谎的学生总数。