华为OD机试 - 最小步骤数(Java 2023 B卷 100分)

目录

华为OD机试 2023B卷题库疯狂收录中,刷题++点这里++

专栏导读

本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

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

要求:

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

二、输入描述

有正整数数组空格分割,数组长度<100。

三、输出描述

正整数 最小步数,不存在输出-1。

四、解题思路

题目要求计算从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数。

步骤要求如下:

  1. 第一步必须从第一个元素起,步长范围为 [1, len/2),其中 len 为数组长度;
  2. 从第二步开始,只能以当前成员的数字作为步数走,不能多也不能少;
  3. 目标不可达时返回 -1,只输出最小的步骤数量;
  4. 只能向数组的尾部走,不能向回走。

具体解题思路如下:

  1. 读取输入的正整数数组;
  2. 初始化数组长度为 len,转换为整型数组 arr;
  3. 初始化最小步数 minCount 为 0;
  4. 从第一步开始,遍历步长从 1 到 len/2 的各种情况:
    • 设置步数 count 为 1,位置 index 为当前步长;
    • 从第二步开始,根据当前位置的数字进行走步操作,直到走出数组范围或者到达最后一个成员;
    • 如果走的长度超出了范围,则说明这种情况不符合要求,退出循环;
    • 如果刚好走到最后一个成员,更新最小步数 minCount。
  5. 根据最小步数 minCount 的值输出结果,如果为 0 则输出 -1,否则输出 minCount。

五、Java算法源码

java 复制代码
public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String[] nums = scanner.nextLine().split(" ");

    int len = nums.length;
    int[] arr = new int[len];
    for (int i = 0; i < len; i++) {
        arr[i] = Integer.parseInt(nums[i]);
    }

    int minCount = 0;

    // 第1步最多只能走 len/2,遍历各种情况
    for (int i = 1; i < len / 2; i++) {
        // 走出第一步后的步数和位置
        int count = 1;
        int index = i;

        // 从第2步开始只能以所在成员的数字走相应的步数
        while (true) {
            // 再走一步
            index += arr[index];

            // 步数加1
            count++;

            if (index > len - 1) {
                // 当走的长度超出了范围,说明这种情况不符合要求
                break;
            } else if (index == len - 1) {
                // 刚好走到最后一个成员,更新最小步数
                if (minCount == 0) {
                    minCount = count;
                } else {
                    minCount = Math.min(minCount, count);
                }
                break;
            }
        }
    }

    if (minCount == 0) {
        System.out.println(-1);
    } else {
        System.out.println(minCount);
    }
}

六、效果展示

1、输入:4 8 7 5 2 3 6 4 8 1

2、输出:2

3、说明:

  1. 第一个可选步长选择2;
  2. 从第一个成员4开始走两步到7;
  3. 第二步:从7经过7个成员到最后。

4、思路分析

  1. 1<=第一步步长<len/2 (len为数组长度),需要遍历第一步的各种可能;
  2. 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少;
  3. 只能向数组的尾部走不能向回走;

🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)

🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)

刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。

相关推荐
热爱编程的小白白11 分钟前
【Playwright自动化】安装和使用
开发语言·python
听风吟丶12 分钟前
Java NIO 深度解析:从 BIO 到 NIO 的演进与实战
开发语言·python
学历真的很重要13 分钟前
LangChain V1.0 Messages 详细指南
开发语言·后端·语言模型·面试·langchain·职场发展·langgraph
sali-tec16 分钟前
C# 基于halcon的视觉工作流-章58-输出点云图
开发语言·人工智能·算法·计算机视觉·c#
lpfasd12317 分钟前
Rust + WebAssembly:让嵌入式设备被浏览器调试
开发语言·rust·wasm
lion King77618 分钟前
c++八股:explicit
开发语言·c++
初见无风21 分钟前
4.3 Boost 库工具类 optional 的使用
开发语言·c++·boost
乐悠小码23 分钟前
Java设计模式精讲---04原型模式
java·设计模式·原型模式
秋风&萧瑟27 分钟前
【C++】智能指针介绍
java·c++·算法
QiZhang | UESTC29 分钟前
JAVA算法练习题day67
java·python·学习·算法·leetcode