专栏导读
本专栏收录于《华为OD机试(JAVA)真题(A卷+B卷)》。
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。
一、题目描述
一个正整数数组 设为nums,最大为100个成员,求从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数。
要求:
- 第一步 必须从第一元素起 且 1<=第一步步长<len/2 (len为数组长度);
- 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少, 如果目标不可达返回-1, 只输出最小的步骤数量;
- 只能向数组的尾部走不能向回走。
二、输入描述
有正整数数组空格分割,数组长度<100。
三、输出描述
正整数 最小步数,不存在输出-1。
四、解题思路
题目要求计算从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数。
步骤要求如下:
- 第一步必须从第一个元素起,步长范围为 [1, len/2),其中 len 为数组长度;
- 从第二步开始,只能以当前成员的数字作为步数走,不能多也不能少;
- 目标不可达时返回 -1,只输出最小的步骤数量;
- 只能向数组的尾部走,不能向回走。
具体解题思路如下:
- 读取输入的正整数数组;
- 初始化数组长度为 len,转换为整型数组 arr;
- 初始化最小步数 minCount 为 0;
- 从第一步开始,遍历步长从 1 到 len/2 的各种情况:
- 设置步数 count 为 1,位置 index 为当前步长;
- 从第二步开始,根据当前位置的数字进行走步操作,直到走出数组范围或者到达最后一个成员;
- 如果走的长度超出了范围,则说明这种情况不符合要求,退出循环;
- 如果刚好走到最后一个成员,更新最小步数 minCount。
- 根据最小步数 minCount 的值输出结果,如果为 0 则输出 -1,否则输出 minCount。
五、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、说明:
- 第一个可选步长选择2;
- 从第一个成员4开始走两步到7;
- 第二步:从7经过7个成员到最后。
4、思路分析
- 1<=第一步步长<len/2 (len为数组长度),需要遍历第一步的各种可能;
- 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少;
- 只能向数组的尾部走不能向回走;
🏆下一篇:华为OD机试 - 荒岛求生 - 栈Stack(Java 2023 B卷 100分)
🏆本文收录于,华为OD机试(JAVA)真题(A卷+B卷)
刷的越多,抽中的概率越大,每一题都有详细的答题思路、详细的代码注释、样例测试,发现新题目,随时更新,全天CSDN在线答疑。