You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Python自定义均值/中位数/众数函数处理2500长度数组报错排查

嘿,我帮你找出代码里的问题啦,主要是众数的计算逻辑错了,还有一些小细节需要调整,一起来看看:

核心问题:众数函数逻辑错误

你的mode函数判断条件完全搞反了,导致根本找不到真正出现次数最多的元素。当前代码里的if (i <= mode) and (sorted_list.count(i) >= max_count)会忽略比当前mode大但出现次数更多的元素。举个例子:如果数组里2出现3次,5出现4次,你的代码会一直把mode保留为2——因为5>2,不满足i<=mode的条件,根本不会更新mode值,这直接导致了Wrong Answer。

另外,每次遍历都调用sorted_list.count(i),对于2500个元素的数组来说,时间复杂度是O(n²),虽然能跑,但效率很低,不如先用字典统计次数。

次要问题:依赖全局变量+输出格式

  • 全局变量N的依赖:你的mean和median函数直接用了全局的N,而不是传入列表的长度len(sample_list)。虽然Hackerrank输入是规范的,但这样的函数复用性很差,万一传入的列表长度和N不一致就会出错。
  • 输出格式可能不匹配:Hackerrank对输出格式要求很严格,比如预期输出里的均值是49921.5(小数),中位数是49253.5,众数是整数2184。你的代码直接print计算结果,可能会出现比如49253.0这样的输出,而题目可能希望输出整数49253

修正后的代码

N = int(input())
var_list = [int(x) for x in input().split()]

def mean(sample_list):
    # 用列表自身长度代替全局N,更健壮
    avg = sum(sample_list) / len(sample_list)
    # 按题目要求输出格式:整数输出整数,小数保留一位
    print(avg if avg % 1 != 0 else int(avg))
    return avg

def median(sample_list):
    sorted_list = sorted(sample_list)
    n = len(sample_list)
    if n % 2 != 0:
        med = sorted_list[n // 2]
    else:
        med = (sorted_list[n//2] + sorted_list[n//2 - 1]) / 2
    # 同样处理输出格式
    print(med if med % 1 != 0 else int(med))
    return med

def mode(sample_list):
    # 用字典统计每个元素的出现次数,O(n)时间复杂度
    count_dict = {}
    for num in sample_list:
        count_dict[num] = count_dict.get(num, 0) + 1
    
    # 找到最大出现次数
    max_count = max(count_dict.values())
    # 收集所有出现次数等于最大值的元素,取其中最小的(符合题目要求)
    mode_candidates = [num for num, cnt in count_dict.items() if cnt == max_count]
    mode_val = min(mode_candidates)
    
    print(mode_val)
    return mode_val

mean(var_list)
median(var_list)
mode(var_list)

代码说明

  1. 众数函数优化:用字典一次遍历统计所有元素的出现次数,然后筛选出所有出现次数最多的元素,取最小值——完全符合题目中“多个众数选最小”的要求,而且效率比原来高很多。
  2. 移除全局变量:所有函数都使用len(sample_list)代替全局N,函数独立性更强,不容易出错。
  3. 输出格式适配:判断计算结果是整数还是小数,分别输出对应的格式,和预期输出完全匹配。

测试小技巧

你可以用小数组验证每个函数的正确性:

  • 测试众数:[1,1,2,2,3]应该返回1(1和2出现次数相同,选最小);[1,2,2,3,3,3]应该返回3
  • 测试中位数:[1,2,3,4]返回2.5[1,2,3]返回2

内容的提问来源于stack exchange,提问作者Kovus Seyit

火山引擎 最新活动