头条面试题——台阶积水

46 篇文章 0 订阅

在这里插入图片描述

解题思路

要计算所有台阶上的积水,只要将每个台阶上的积水量累加,就是所有台阶的积水量。而每个台阶的若想积水则其左右台阶的(最高)高度都要高于当前台阶才可以。
如题,当前台阶为:
0,1,0,2,1,0,1,3,2,1,2,1
每个台阶的积水量为:
0,0,1,0,1,2,1,0,0,1,0,0
每个台阶左边最高台阶高度:(不存在则置0)
0,0,1,1,2,2,2,2,3,3,3,3
每个台阶右边最高台阶高度:(不存在则置0)
3,3,3,3,3,3,3,2,2,2,2,0
可见,当前台阶的积水量由其左右最高台阶高度决定,当当前台阶高度大于任一左右最高台阶时,当前台阶积水为:0,否则当前台阶积水量 = 其左右最高台阶中的次高台阶 - 当前台阶高度
如图:
在这里插入图片描述

代码实现:
<?php

    //$steps = [0,1,0,2,5,0,1,3,2,4,0,2,0,1];  //测试数据
    $steps = [0,1,0,2,1,0,1,3,2,1,2,1];
    
    $leftTopStep = get_left_top_steps($steps); //数组中每个台阶左边最高台阶高度,
    //将字符串翻转,计算左边最高台阶后,再翻转一次则为右边最高台阶
    $rightTopStep = get_left_top_steps(array_reverse($steps));
    $rightTopStep = array_reverse($rightTopStep);//数组中每个台阶右边最高台阶高度,
    
    //计算所有台阶积水量
    $sum = 0;
    foreach ($steps as $k => $high){
        $weater = 0;
        if($steps[$k] < $leftTopStep[$k] && $steps[$k] < $rightTopStep[$k]){
            $weater = $leftTopStep[$k] - $steps[$k];
            if($weater > ($rightTopStep[$k] - $steps[$k])){
                $weater = $rightTopStep[$k] - $steps[$k];
            }
            $sum += $weater;
        }
        $weaterStep[$k] = $weater; //记录每个台阶积水量,可忽略
    }
    echo '所有台阶积水量为:'.$sum.'<br>';
    
    //以下为测试输出
    echo "台阶高度:<br>";
    foreach ($steps as $k => $v){
        echo $v."__";
    }
    echo "<br>";
    
    echo "左边台阶最高高度:<br>";
    foreach ($leftTopStep as $k => $v){
        echo $v."__";
    }
    echo "<br>";
    
    echo "右边台阶最高高度:<br>";
    foreach ($rightTopStep as $k => $v){
        echo $v."__";
    }
    echo "<br>";
    
    echo "每个台阶积水量:<br>";
    foreach ($weaterStep as $k => $v){
        echo $v."__";
    }
    echo "<br>";
    
    /**
     * 计算数组中每个台阶左边最高台阶高度,不存在则置0
     * @param $steps
     * @return array
     */
    function get_left_top_steps($steps){
        $leftTopStep = [];
        $count = count($steps);
        for($i = 0 ; $i < $count ; $i++){
            if(!isset($steps[$i-1])){
                $leftTopStep[$i] = 0;
            }else{
                if($steps[$i-1] > $leftTopStep[$i-1]){
                    $leftTopStep[$i] = $steps[$i-1];
                }else{
                    $leftTopStep[$i] = $leftTopStep[$i-1];
                }
            }
        }
        return $leftTopStep;
    }
    
输出
所有台阶积水量为:6
台阶高度:
0__1__0__2__1__0__1__3__2__1__2__1__
左边台阶最高高度:
0__0__1__1__2__2__2__2__3__3__3__3__
右边台阶最高高度:
3__3__3__3__3__3__3__2__2__2__1__0__
每个台阶积水量:
0__0__1__0__1__2__1__0__0__1__0__0__

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值