记群里面一个头条面试题

191 阅读1分钟

第一题忽略,第二题大数计算(注意点就是以链表尾巴存数字最高位,计算完后反转链表)

第三题解析

细细观察,发现是两个黑的中间可以存储水 是不是类似括号的判断

那么一行一行观察 左括号和右括号中间取中间内容

上代码先:

function main(arr){
    let max = Math.max(...arr)
    let list = []
    for(let i=0;i<arr.length;i++){
        list.push(new Array(max).fill(0).fill(1,0,arr[i]))
    }
    let sum = 0;
    for(let i=0;i<max;i++){
        sum += calc(list, i)
    }
    console.log(sum)
}
function calc(list,index){
    let start = false
    let begin = 0;
    let sum = 0;
    for(let i=0;i<list.length;i++){
        if(list[i][index]){
            if(start){
                start = false
                sum += i-begin-1
            }else{
                start = true
                begin = i;
            }
        }
    }
    return sum
}
main( [0,1,0,2,1,0,1,3,2,1,2,1]);  //console.log(6)

思路就是

1.找到最大的长度 Math.max(...arr)

2.根据数字对应转换成黑框 是1就是黑框 是0就是空没有框 如 1 那就是最底1 层是黑框

3.根据黑框一开一闭统计中间个数


本来这样已经得出答案 本着不优化不写文章的思路

function main(arr){
    let max = Math.max(...arr)
    let sum = 0;
    for(let i=0;i<max;i++){
        sum += calc(arr, i)
    }
    console.log(sum)
}
function calc(arr,index){
    let start = false
    let begin = 0;
    let sum = 0;
    for(let i=0;i<arr.length;i++){
        if(arr[i] >= index){
            if(start){
                start = false
                sum += i-begin-1
            }else{
                start = true 
                begin = i;
            }
        }
    }
   
    return sum
}
main( [0,1,0,2,1,0,1,3,2,1,2,1]);  //console.log(6)

只要大于当前数字 那就说明存在黑框