一
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。
一眼看到这题,要左右左右对比计算好烦,于是立刻想到一层一层计算的方法,但是使用递归的话会爆栈啊??不管了————谁叫我像风一样自由~ 就像你的温柔 ~ 无法挽留 ~
如下图:去除数组(柱子)前后为 0 的数(高度为 0),计算中间为 0 的数,循环数减一,小于 0 记做 0。中间为 0 就看做是一个体积,累加后就是整个接水量。
let trap = function(array) {
let replace = [],
newArray,
reduce,
j = 0,
n = 0;
newArray = array.toString(); // 转为字符串"0,1,0,2,1,0,1,3,2,1,2,1"
newArray = newArray.replace(/^(0\,)+/gi, ""); // 去掉开始的0 :"1,0,2,1,0,1,3,2,1,2,1"
newArrayNum = newArray.replace(/(\,0)*$/gi, "").replace(/\,*/g, ""); // 去掉末尾的0,并去掉逗号:"10210132121"
for (let i = 0; i < newArrayNum.length; i++) {
// 循环字符串长度,如果值为0 则累加结果
if (Number(newArrayNum[i]) === 0) {
j++;
}
// n标记有多少个大于0的数
if (Number(newArrayNum[i]) > 0) {
n++;
}
// 如果值减1后小于0 ,则当前值记为0,否则减1
if (Number(newArrayNum[i]) - 1 < 0) {
reduce = 0;
} else {
reduce = Number(newArrayNum[i]) - 1;
}
// 得出新数组
replace.push(reduce);
}
// 如果数组中大于1的个数小于2,此轮结果记为0,否则结果累加
if (n <