hackerrank挑战题——寻找正在运行的中位数

来源:互联网 发布:java运行命令行参数 编辑:程序博客网 时间:2024/05/20 19:46

题目如截图所示:




题目大概意思:

整数的数据集的中位数是数据集的中点值,其中相等数量的整数小于和大于值。要查找中值,必须首先以非递减顺序对整数数据集进行排序,然后:

  • 如果数据集包含奇数个元素,中位数是排序样本的中间元素。在排序数据集中{1,2,3},2就是中位数。
  • 如果数据集包含偶数个元素,中值是排序样本的两个中间元素的平均值。在排序数据集中{1,2,3,4}中,(2+3)/2 = 2.5就是中位数。
给定整数的输入流,必须为每个整数执行以下任务:

  1. 将第i个整数添加到正在运行的整数列表中;
  2. 查找更新列表的中位数(即,通第i个过元素的第一个元素)。
  3. 在新的一行打印列表更新的中间值。打印值必须是双精度数字到小数点(即12.3格式)。
输入格式

   第一行包含一个整数n,表示数据流中整数的个数。
后续行的每一行包含一个整数ai,将添加到您的列表中。

限制条件

1<n<10^5

0<ai<10^5

输出格式

         将每个新整数添加到列表之后,将列表中更新的中位数打印为新行,作为一个单一的双精度数字缩放到小数点1位(即12.3格式)。

样本输入

6

12

4

5

3

8

7

样本输出

12.08.05.04.55.06.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);

效果输出: