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

题目如截图所示:




题目大概意思:

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

  • 如果数据集包含奇数个元素,中位数是排序样本的中间元素。在排序数据集中{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.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);

效果输出:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值