快捷搜索: 王者荣耀 脱发

华为机试练习(九)找终点

题目描述 给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数。第一步必须从第一元素开始,1<=步长<len/2, 第二步开始以所在成员的数字走相应的步数,如果目标不可达返回-1,只输出最少的步骤数。
样例输入 7 5 9 4 2 6 8 3 5 4 3 9
样例输出 2
说明 第一步走2步(2<len/2),走到9,第二步走9步到底最后一个成员,最少步数两步

【分析】 第一步可以走 [1,len/2) 的任意一种,遍历所有情况,找到符合要求的最小步骤

【实现】

// 输入
const input = "7 5 9 4 2 6 8 3 5 4 3 9"
const arr = input.split(" ").map((x) => parseInt(x, 10))
const len = arr.length

// 记录最小步数
let res = Infinity

// 第一步最多只能走 len/2
const range = len / 2

for (let i = 1; i < range; i++) {
          
   
	// 走的步数
    let count = 1
	// 当前索引
    let index = i
    
    while (1) {
          
   
    	// 向后走 arr[index] 步
        index += arr[index]
        // 步数加1
        count++
        if (index > (len - 1)) {
          
   
        	// 当走的长度超出了范围,说明这种情况不符合要求
            break
        } else if (index === (len - 1)) {
          
   
        	// 刚好走到最后一个成员,更新最小步数
            res = Math.min(res, count)
            break
        }
    }
}

if (res === Infinity) {
          
   
	// 没有符合要求的情况,输出-1
    console.log(-1);
} else {
          
   
    console.log(res)
}

做荣耀笔试题的时候刚好遇到了这道题,当时没来得及细想,只通过了 80%
回头再看发现应该是第 12 行的循环遍历在笔试时写错了,当时想的是从最大步长开始遍历,遇到符合要求的就结束循环并输出,现在想来必须要完整的遍历所有情况,才能找到步长最小的;从最大步长找到的,并不能保证它所用的步数最小!
经验分享 程序员 微信小程序 职场和发展