简单题:统计班级中的说谎者
题目链接: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
算法步骤
- 排序:首先对成绩数组进行排序。排序后的数组可以帮助我们更容易地计算每个学生的相对位置。
- 计数:在排序后的数组中,可以通过一次遍历来计算每个学生的相对位置,从而判断是否说谎。
- 判断:如果小于等于他的学生数量大于比他分数高的学生数量,则该学生会说谎。
- 统计:统计所有会说谎的学生数量。
具体代码步骤
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)
关键步骤
- 排序:
sorted_A = sorted(A)对成绩数组进行排序。 - 计数:在排序后的数组中,通过一次遍历计算每个学生的相对位置。
- 判断:
if xiaoyu > dayu判断是否说谎。
关键知识点总结
-
数组操作:
- 数组的排序:使用
sorted()函数对数组进行排序。 - 数组的遍历:使用
for循环遍历数组。
- 数组的排序:使用
-
条件判断:
- 使用
if语句判断某个条件是否成立。 - 使用计数器统计满足条件的元素数量。
- 使用
-
时间复杂度:
- 排序的时间复杂度为
O(N log N)。 - 遍历数组的时间复杂度为
O(N)。
- 排序的时间复杂度为