阿里前端笔试算法题。做个记录。

我笔试的时候并没有写出来。

有点懵,题目看了好久。

开始写的时候一开始思路也没正确打开。

笔试完了,安静思考了一会儿就解决了。

如果不正,欢迎指出。

交卷的时候截图的,所有一个图层。见谅~

code如下:

        function solve(arr){
            let newArr = []
            for(let i = 0;i<arr.length; ){
                flag:
                if(arr[i]>=arr.length-i){  //如果可以直达最后一项,则直接存入该项跟最后一项,然后返回。   
                    newArr.push(arr[i])
                    newArr.push(arr[arr.length-1])
                    return newArr
                }
                else{
                    for(let k = 1;k<arr[i];k++){   //循环遍历接下来的arr[i]步内的节点
                        let slice = arr.slice(k+i+1,i+arr[i]+1)   //slice(start,end)返回指定下标区间的数组,不包含end项,不改变原数组
                        let left = 0            //计数,该值是未走节点可用步数之和。
                        slice.forEach(e=>{
                            left+=e
                        })
                        if(arr[k+i]>=arr.length-i){        //arr[k+i]此节点可以直达终点则跳到此节点。
                            newArr.push(arr[i])
                            i=i+k
                            break flag         //跳出循环,进入下一次循环。
                        }
                        else if(arr[i+k]>left){       //如果arr[i+k]节点步数大于(i+k~i+arr[i])未走节点步数之和,则跳到此节点 
                            newArr.push(arr[i])
                            i=i+k
                            break flag
                        }
                    }
                    newArr.push(arr[i])          //接下来的节点无大步数。
                    i=i+arr[i]
                }
            }
            return newArr
        }
        console.log(solve([4, 8, 4, 1, 2,1,1,1,1, 1, 8, 5]))   // [4, 8, 1, 8, 5]

猜你喜欢

转载自blog.csdn.net/q275757160/article/details/89195469
今日推荐