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

111 阅读2分钟

简单题:统计班级中的说谎者

题目链接:www.marscode.cn/practice...

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

样例1:

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

样例2:

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

样例4:

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

样例5:

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

算法步骤

  1. 排序:首先对成绩数组进行排序。排序后的数组可以帮助我们更容易地计算每个学生的相对位置。
  2. 计数:在排序后的数组中,可以通过一次遍历来计算每个学生的相对位置,从而判断是否说谎。
  3. 判断:如果小于等于他的学生数量大于比他分数高的学生数量,则该学生会说谎。
  4. 统计:统计所有会说谎的学生数量。

具体代码步骤

def solution(A):
    # 对成绩数组进行排序
    sorted_A = sorted(A)
    
    # 初始化计数器
    count = 0
    
    # 遍历每个学生的成绩
    for i in range(len(A)):
        # 计算有多少个学生的成绩小于等于当前学生的成绩
        xiaoyu = 0
        for j in range(len(sorted_A)):
            if sorted_A[j] <= A[i]:
                xiaoyu += 1
            else:
                break
        
        # 计算有多少个学生的成绩大于当前学生的成绩
        dayu = len(sorted_A) - xiaoyu
        
        # 判断是否说谎
        if xiaoyu > dayu:
            count += 1
    
    return count

if __name__ == "__main__":
    # Add your test cases here
    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. 排序sorted_A = sorted(A) 对成绩数组进行排序。
  2. 计数:在排序后的数组中,通过一次遍历计算每个学生的相对位置。
  3. 判断if xiaoyu > dayu 判断是否说谎。

关键知识点总结

  1. 数组操作

    • 数组的排序:使用 sorted() 函数对数组进行排序。
    • 数组的遍历:使用 for 循环遍历数组。
  2. 条件判断

    • 使用 if 语句判断某个条件是否成立。
    • 使用计数器统计满足条件的元素数量。
  3. 时间复杂度

    • 排序的时间复杂度为 O(N log N)
    • 遍历数组的时间复杂度为 O(N)