华为OD机试真题 Java 实现【找终点】【2023 B卷 100分】,附详细解题思路-LMLPHP

一、题目描述

给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。

要求:

  1. 第一步必须从第一元素开始,且1 <= 第一步的步长 < len/2,len为数组的长度,需要自行解析;
  2. 第二步开始,只能以所在成员的数字走相应的步数,不能多也不能少,如果目标不可达返回-1,只输出最少的步骤数量;
  3. 只能向数组的尾部走,不能往回走;

二、输入描述

由正整数组成的数组,以空格分隔,数组长度小于100,请自行解析数据数量。

三、输出描述

正整数,表示最少的步数,如果不存在输出-1。

四、解题思路

  1. 给定一个正整数数组,设为nums;
  2. 遍历nums,根据题目描述“第一步的步长 < len/2”,因为从0开始,所以循环到nums.length / 2 - 1;
  3. 根据当前index的值,再走n步,循环往复;
    • 比如测试的输入4 2 9 5 3 8 1 5 5 7 2 6 9
    • 第一步为数字4,前进4步,到达nums[4],即为3;
    • 再走3步,到达nums[7],即为5;
    • 再走5步,正好到达最后一个数字9,完美;
  4. 判断最后一次的下角标是否等于最后一个,如果等于,则符合要求;
  5. 取符合要求的最小步骤数;
  6. 输出使用的最少步骤数,如果没有,输出-1。

五、Java算法源码

/**
 * 求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。
 */
public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);
    // 给定一个正整数数组,设为nums
    int[] nums = Arrays.stream(sc.nextLine().split(" ")).mapToInt(Integer::parseInt).toArray();

    // nums的下角标
    int index = 0;
    // 步数
    int stepCount = 0;
    // 最少步骤数,最大为100个成员
    int min = 100;
    // 是否有符合要求的最少步骤数
    boolean flag = false;

    // 第一步的步长 < len/2,从0开始,故-1
    for (int i = 0; i < nums.length / 2 - 1; i++) {
        index = i;
        stepCount = 1;

        // 比如第一步为数字4,前进4步,到达nums[4],即为3,再走3步,到达nums[7],即为5,再走5步,正好到达最后一个数字9
        while (index < nums.length - 1) {
            System.out.println("走"+index+"步");
            index += nums[index];
            stepCount++;
        }

        // 判断最后一次的下角标是否等于最后一个,如果等于,则符合要求
        if (index == nums.length - 1) {
            System.out.println("符合要求的步数:"+stepCount);
            flag = true;
            min = Math.min(min, stepCount);
        }
    }

    // 输出使用的最少步骤数,如果没有,输出-1
    System.out.println(flag ? min : -1);
}

六、效果展示

1、输入

4 2 9 5 3 8 1 5 5 2 2 1 9

2、输出

3

3、说明

比如走0步,值为4,前进4步,到达nums[4],即为3,再走3步,到达nums[7],即为5,再走5步,正好到达最后一个数字9,花费4步。

比如走1步,值为2,前进2步,到达nums[9],即为1,再走1步,正好到达最后一个数字9,花费3步。

比如走3步,值为5,前进5步,到达nums[8],即为5,再走5步,正好到达最后一个数字9,花费3步。

取符合要求的最小步数,所以输出3。

华为OD机试真题 Java 实现【找终点】【2023 B卷 100分】,附详细解题思路-LMLPHP


🏆下一篇:华为OD机试真题 Java 实现【云短信平台优惠活动】【2023Q1 200分】

🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【找终点】【2023 B卷 100分】,附详细解题思路-LMLPHP

06-03 23:47