头条面试题——台阶积水

头条面试题——台阶积水_第1张图片

解题思路

要计算所有台阶上的积水,只要将每个台阶上的积水量累加,就是所有台阶的积水量。而每个台阶的若想积水则其左右台阶的(最高)高度都要高于当前台阶才可以。
如题,当前台阶为:
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,否则当前台阶积水量 = 其左右最高台阶中的次高台阶 - 当前台阶高度
如图:
头条面试题——台阶积水_第2张图片

代码实现:

 $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.'
'; //以下为测试输出 echo "台阶高度:
"; foreach ($steps as $k => $v){ echo $v."__"; } echo "
"; echo "左边台阶最高高度:
"; foreach ($leftTopStep as $k => $v){ echo $v."__"; } echo "
"; echo "右边台阶最高高度:
"; foreach ($rightTopStep as $k => $v){ echo $v."__"; } echo "
"; echo "每个台阶积水量:
"; foreach ($weaterStep as $k => $v){ echo $v."__"; } echo "
"; /** * 计算数组中每个台阶左边最高台阶高度,不存在则置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__

你可能感兴趣的:(PHP,编程)