华为od真题 最小步骤数

最小步骤数 题目描述 一个正整数数组,设为nums 最大为100个成员 求从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数 要求: 第一步,必须从第一元素起,且1 <= 第一步步长 < len / 2 (len为数组长度) 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少,如果目标不可达返回-1,只输出最小的步骤数量 只能向数组的尾部走不能向回走 输入描述 一个正整数数组,元素用空格分割 数组长度 < 100 输出描述 正整数,最小步数 不存在输出-1 示例一 输入 7 5 9 4 2 6 8 3 5 4 3 9 输出 2 说明 第一个可选步长选择2 从第一个成员7开始走两步到9 第二步从9经过9个成员到最后 示例二 输入 1 2 3 7 1 5 9 3 2 1 输出 -1
 

const readline = require('readline');

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});

rl.on('line', (input) => {
    const nums = input.split(' ').map(Number);
    const len = nums.length;

    // 第一步的步长范围是 1 <= step < len / 2
    const firstStepMax = Math.floor((len - 1) / 2);

    let minSteps = Infinity;

    // 遍历所有可能的第一步
    for (let firstStep = 1; firstStep <= firstStepMax; firstStep++) {
        let currentIndex = firstStep;
        let steps = 1;

        // 开始BFS
        while (currentIndex < len - 1) {
            const nextStep = nums[currentIndex];
            if (nextStep === 0) break; // 如果步长为0,无法继续前进
            currentIndex += nextStep;
            steps++;
        }

        // 如果到达最后一个元素,更新最小步数
        if (currentIndex === len - 1) {
            minSteps = Math.min(minSteps, steps);
        }
    }

    // 输出结果
    if (minSteps !== Infinity) {
        console.log(minSteps);
    } else {
        console.log(-1);
    }

    rl.close();
});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值