题目如截图所示:
题目大概意思:
整数的数据集的中位数是数据集的中点值,其中相等数量的整数小于和大于值。要查找中值,必须首先以非递减顺序对整数数据集进行排序,然后:
- 如果数据集包含奇数个元素,中位数是排序样本的中间元素。在排序数据集中{1,2,3},2就是中位数。
- 如果数据集包含偶数个元素,中值是排序样本的两个中间元素的平均值。在排序数据集中{1,2,3,4}中,(2+3)/2 = 2.5就是中位数。
- 将第i个整数添加到正在运行的整数列表中;
- 查找更新列表的中位数(即,通第i个过元素的第一个元素)。
- 在新的一行打印列表更新的中间值。打印值必须是双精度数字到小数点(即12.3格式)。
第一行包含一个整数n,表示数据流中整数的个数。
后续行的每一行包含一个整数ai,将添加到您的列表中。
限制条件
1<n<10^5
0<ai<10^5
输出格式
将每个新整数添加到列表之后,将列表中更新的中位数打印为新行,作为一个单一的双精度数字缩放到小数点1位(即12.3格式)。
样本输入
6
12
4
5
3
8
7
样本输出
12.0
8.0
5.0
4.5
5.0
6.0
后面就是样例分析,这部分就不说了。
好,我们现在直接回归主题,根据题意,我们模拟成如下情况,直接上代码。
<?php
function FindtheRunningMedian($n,$array){
if($n < 1 || $n > pow(10,5)){
echo '参数不符合要求!';
exit;
}
$temp_arr = array();
//一次添加一个数据到新的临时数组里,符合要求
foreach ($array as $key => $value) {
if($value < 0 || $value > pow(10,5)){
echo '参数不符合要求!';
exit;
}
$temp_arr[] = $value;
sort($temp_arr);//对新数组进行升序排序
$count = count($temp_arr);
if($count % 2 == 0){// 偶数个数时
$start = ($count-2)/2;//最中间前一个值的位置
$end = $count/2;//最中间后一个值的位置
echo number_format(($temp_arr[$start] + $temp_arr[$end])/2,1),'<br>';
}else{// 奇数个数时
$position = ($count-1)/2;
echo number_format($temp_arr[$position],1),'<br>';
}
}
}
$array = array(12,4,5,3,8,7);
FindtheRunningMedian(6,$array);
效果输出: