110,545
社区成员
发帖
与我相关
我的任务
分享
using System;
using System.Linq;
namespace ConsoleApp1
{
class Program
{
static void Main(string[] args)
{
var n = int.Parse(Console.ReadLine()); //出题中这里纯粹是多余
var ns = Console.ReadLine()
.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Take(n)
.Select(x => int.Parse(x));
var m = int.Parse(Console.ReadLine()); //出题中这里纯粹是多余
var ms = Console.ReadLine()
.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries)
.Take(m)
.Select(x => int.Parse(x));
var 合并 = ns.Concat(ms).Distinct().ToArray();
Console.WriteLine(合并.Skip(合并.Length / 2 - 1).Take(合并.Length % 2 == 1 ? 1 : 2).Average());
Console.WriteLine("...........按任意键结束");
Console.ReadKey();
}
}
}
这里的合并集合的 .Length/2-1 得到了中位数的位置(下标从0开始,所以需要-1),而中位数个数根据总的单元是偶数还是奇数而定,如果合并单元个数是偶数则中位数有2个,如果是奇数则只有1个中位数。中位数(又称中值,英语:Median),统计学中的专有名词,代表一个样本、种群或概率分布中的一个数值,其可将数值集合划分为相等的上下两部分。对于有限的数集,可以通过把所有观察值高低排序后找出正中间的一个作为中位数。如果观察值有偶数个,通常取最中间的两个数值的平均数作为中位数。
并未说集合中的元素不可重复
应该说
给出A=[1,2,3,4,5,6]和B=[2,3,4,5],它们合并后的数组是[1,2,3,4,5,6],合并后数组的中位数是3.5(注:(3+4)/2)。
这个描述是有问题的,应该是:
给出A=[1,2,3,4,5,6]和B=[2,3,4,5],它们合并后的数组是[1,2,2,3,3,4,4,5,5,6],合并后数组的中位数是3.5(注:(3+4)/2)。
将长度分别为 m 和 n 的两个数组合并成长度为 m+n 的数组进行计算,是最差的算法O(m+n),并且需要大量内存
其实这个题是很经典的了(搜索 两个有序数组求合并后,求其中位数)接近 O(log(min(m,n))) 的算法实现代码有很多