我笔试的时候并没有写出来。
有点懵,题目看了好久。
开始写的时候一开始思路也没正确打开。
笔试完了,安静思考了一会儿就解决了。
如果不正,欢迎指出。
交卷的时候截图的,所有一个图层。见谅~
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]