df-drills pandas · Polars · DuckDB SQL · DuckDB Relational 题目列表 登录

频率表求中位数

困难 21-classic 面试经典题型 medianfrequencycumsumwindow

score_freq 是一张频数表:每行表示某科目中分数为 score 的人有 freq 个。求每个科目的中位数。

  • 把频数展开成逐人的分数列表后求中位数:总人数 N 为奇数时取排序后正中间的那个分数;N 为偶数时取正中间两个分数的算术平均(两个分数可能不同,也可能相同)。
  • 同一科目里同一个 score 可能出现在多行,频数要合并;freq = 0 的行表示没有人,不参与计算。
  • 每个科目的总频数至少为 1。freq 是非负整数,score 是整数,可能为负。
  • 输入行没有按分数排序。

输入

  • score_freq(subject, score, freq)

输出

列为 subject, median,median 为浮点数,不舍入。每个科目一行,行顺序不限。

输入表 (case base,共 2 个 case:base、edge)

score_freq local/base/score_freq
#subjectstringscoreint64freqint64
1 math 60 2
2 math 70 3
3 math 80 1
4 math 90 1
5 english 55 1
6 english 65 1
7 english 75 1
8 english 85 3
9 physics 77 1
共 9 行

期望输出 (case base,行顺序不限)

#subjectStringmedianFloat64
1 english 80.0
2 physics 77.0
3 math 70.0
共 3 行