题目解析:统计班级中的说谎者
1.问题描述
1.1 问题理解
给出一个n维的列表A,里面装载着n个学生的成绩,当一个学生发现比他自己分数高的同学,要少于比他分数低或者和他分数一样的同学时,这个学生就会说谎,换而言之,如果你排在班级前50%以上,你就会说谎。那么要统计这样的人数,应该怎么统计呢?
1.2 问题转化
所以,这个问题就被转化成了,求排在班级前50%的人数。
2.思路分析
按正常的想法来看,统计前50%的人这种题实在是太简单了,直接让人数除于2不就是有50%的人了吗? 这道题虽然是简单题,但也没有那么的简单,而且还需要我们理解题目的意思。
在这道题中,唯一需要考虑的一个点是,学生的成绩相等怎么办?如果学生的成绩全部相等,那么所有学生都会拿第一名,所有学生都会说谎了。因此,不能简单的把学生人数除于2。
这道题是思路应该是,先算出学生成绩的中位数,然后高于或者等于学生成绩中位数的同学都会撒谎,然后再把他们统计起来。
3.具体实现
3.1具体实现
有了思路以后,就可以着手于写代码了。具体代码如下:
def solution(A):
# 对列表A进行排序
sorted_A = sorted(A)
# 计算列表长度
n = len(sorted_A)
# 如果列表长度是奇数,直接取中间的数作为中位数
if n % 2 == 1:
mid_A = sorted_A[n // 2]
# 如果列表长度是偶数,取中间两个数的平均值作为中位数
else:
mid_A = (sorted_A[n // 2 - 1] + sorted_A[n // 2]) / 2
# 计算大于中位数的元素数量
count = sum(1 for x in sorted_A if x >= mid_A)
return count
通过统计大于中位数的人数,我们就成功统计了说谎者的人数
3.2 AI思路实现
在这道题中,我除了尝试用自己思路实现,也尝试使用AI思路进行实现,AI思路感觉像不会将问题进行简化,这让人感觉代码还有非常大的优化空间。
AI实现的代码如下:
def solution(A):
# 对列表A进行排序
sorted_A = sorted(A)
# 遍历每个学生的成绩
for i in range(len(A)):
# 计算当前成绩的排名(即小于等于该成绩的学生数量)
rank = sorted_A.index(A[i]) + 1
rank += A.count(A[i]) - 1
# 判断是否满足“说谎”的条件
if rank > (len(A) - rank):
lie_count += 1
return lie_count
它是直接按照题目的要求解决出来,并没有太多的思路和问题简化
4.总结
在运用AI刷题的过程中,我常常想着让AI给我思路,渐渐的好像就不太想去有自己的思路了。像是这种简单题,虽然很简单,但思路分析的过程是很重要的。而目前为止,AI好像没办法对我们有太大的帮助,它更多只是一个按照要求执行的机器。
我们利用AI,的确是让我们能更加方便,但也不能太过依赖,不然以后怕是彻底竞争不过AI咯。