You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java无序列表中位数计算出错:输出4而非3,求解决方案

问题分析与解决方案

你的猜测错误——排序后的列表是保持有序的,问题出在中位数的索引计算逻辑的易出错性上(或你实际运行的代码存在笔误)。

你的原代码中用Math.ceil(length / 2)计算索引,对于奇数长度的列表来说,理论上结果正确,但这种写法不够直观,容易引发混淆。更可靠的方式是根据列表长度的奇偶性直接定位中位数:

  • 奇数长度的列表:中位数是排序后位于正中间的元素,对应0-based索引为size / 2(整数除法,比如5/2=2)
  • 偶数长度的列表:通常取中间两个元素的平均值(若需返回整数可做取整处理)

修正后的代码

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class MockTest1 {
    /*
     given a random list of integers, find the median e.g. given the list [1, 4, 2, 3, 5] the median is 3 
    */
    
    public static void main(String[] args) {
        List<Integer> array = List.of(1, 3, 4, 5, 2);
        System.out.println(getMedian(array));
    }
    
    public static int getMedian(List<Integer> arr) {
        ArrayList<Integer> list = new ArrayList<>(arr);
        Collections.sort(list);
        int size = list.size();
        
        if (size % 2 == 1) {
            // 奇数长度,返回中间元素
            return list.get(size / 2);
        } else {
            // 偶数长度,返回中间两个元素的平均值(取整)
            return (list.get(size/2 - 1) + list.get(size/2)) / 2;
        }
    }
}

运行这段代码,输入列表[1,3,4,5,2]会输出预期的3。同时请确认代码中Collections.sort(list)确实执行,且排序后没有对列表进行其他修改操作,这是保证中位数计算正确的前提。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 03:31:22