题目一:【接雨水】力扣——42
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6
脚本:
#!/bin/bash
#接雨水
#author:yzt 2019-11-17
#
read -t 40 -p "请输入数组:" contents
declare -i aa=1
declare -i bb=1
cat /dev/null >result.txt
echo "$contents"|sed 's#\[\|\]##g'|sed 's#,#\n#g'|grep -n -v "^$" >tmp1.txt
total=`cat tmp1.txt|wc -l`
while :
do
i=`sed -n "$bb p" tmp1.txt`
hangshu1=`echo "$i"|awk -F : '{print $1}'`
zhugao=`echo "$i"|awk -F : '{print $2}'`
hangshu2=`sed "$aa,$bb d" tmp1.txt|awk -F : -v j=$zhugao '$2>=j{print $1}'|head -n1`
hangshu3=`sed "$aa,$bb d" tmp1.txt|awk -F : -v j=$zhugao '$2<j{print $0}'\
|sort -n -t ":" -k 2|tail -n1|awk -F : '{print $1}'`
if [ ! -z $hangshu3 ];then
zhugao1=`sed -n "$hangshu3 p" tmp1.txt|awk -F : '{print $2}'`
fi
if [ ! -z $hangshu2 ];then
length1=$[$hangshu2-$hangshu1]
shuiliang1=$[$zhugao * $length1]
hangshu4=$[$hangshu2-1]
sed -n "$hangshu1,$hangshu4 p" tmp1.txt|awk -F : '{print $2}' > tmp2.txt
sum=0
for j in `cat tmp2.txt`
do
sum=$[$sum+$j]
done
shuiliang1=$[$shuiliang1-$sum]
echo "$shuiliang1" >>result.txt
bb=$hangshu2
else
if [ -z $hangshu3 ];then
break
else
length2=$[$hangshu3-$hangshu1]
shuiliang2=$[$length2 * $zhugao1]
hangshu5=$[$hangshu1+1]
sed -n "$hangshu5,$hangshu3 p" tmp1.txt|awk -F : '{print $2}' >tmp2.txt
sum1=0
for k in `cat tmp2.txt`
do
sum1=$[$sum1+$k]
done
shuiliang2=$[$shuiliang2-$sum1]
echo "$shuiliang2" >>result.txt
bb=$hangshu3
fi
fi
if [ $bb -ge $total ];then
break
fi
done
totle_sum=o
for item in `cat result.txt`
do
totle_sum=$[$totle_sum + $item]
done
echo "$totle_sum"
【脚本逻辑】:
第一:将数组中的非负整数想象为墙高,接雨水的条件是:两墙之间有凹槽存在。
第二:从左边第一块墙,称为a墙开始,如果右边存在比a墙高(含相等)的b墙时,a墙与b墙之间能装的雨水为以a墙的高度乘以ab墙之间的宽度,并且减去a墙到b墙之前存在的小墙;如:(此时第5块墙变为左边第一块墙,继续后续操作)
第三:从左边第一块墙,墙a开始,右边并没有比墙a高或相等的墙,此时需要采用另外一种做法:
获取右边的墙中“最高且排最右边”的墙(有可能右边有两块墙是最高的),先计算出其总的容量,再减去已存在墙体的容量,最后得到雨水的容量,如下所示:(此时左边的第一块墙变为下图的第10块墙,并执行后续操作)
第四:程序将在左边第一块墙的行数大于或等于数组的个数时,退出循环,并开始计算雨水的总量。
脚本效果:
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,0,4,0,1,3,9,0,4,8,1]
20
[root@localhost leetcode]# vim jieyushui.sh
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,2,0,0,4,1]
4
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,2,0,0,4,0,1]
5
[root@localhost leetcode]# ./jieyushui.sh
请输入数组:[0,1,0,2,1,0,1,3,2,1,2,1]
6