目录

裴先生
裴先生
发布于 2022-04-22 / 1 阅读
0
0

【算法题】找终点

原创

题目描述

给定一个正整数数组,设为nums,最大为100个成员,求从第一个成员开始,正好走到数组最后一个成员,所使用的最少步骤数。 要求: 1、第一步必须从第一元素开始,且1<=第一步的步长<len/2;(len为数组的长度,需要自行解析)。 2、从第二步开始,只能以所在成员的数字走相应的步数,不能多也不能少, 如果目标不可达返回-1,只输出最少的步骤数量。 3、只能向数组的尾部走,不能往回走。

题目要求

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

  • 输出描述: 正整数,表示最少的步数,如果不存在输出-1

示例1

输入 7 5 9 4 2 6 8 3 5 4 3 9 输出 2 说明 第一步: 第一个可选步长选择2,从第一个成员7开始走2步,到达9;第二步: 从9开始,经过自身数字9对应的9个成员到最后。

示例2

输入 1 2 3 7 1 5 9 3 2 1 输出 -1

JAVA解法

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String line = sc.nextLine().trim();
        if (line.isEmpty()) {
            System.out.println(-1);
            return;
        }
        // 按空格解析正整数数组
        String[] parts = line.split("\\s+");
        int n = parts.length;
        int[] nums = new int[n];
        for (int i = 0; i < n; i++) {
            nums[i] = Integer.parseInt(parts[i]);
        }

        int minSteps = Integer.MAX_VALUE;

        // 第一步步长 step1 满足: 1 ≤ step1 < n/2
        for (int step1 = 1; step1 * 2 < n; step1++) {
            int steps = 1;
            int pos = step1; // 第一步到达的位置

            // 模拟后续跳跃
            while (pos < n - 1) {
                int jump = nums[pos];
                pos += jump;
                steps++;
                if (pos == n - 1) {
                    minSteps = Math.min(minSteps, steps);
                    break;
                } else if (pos > n - 1) {
                    break; // 超出数组,不可达
                }
            }
        }

        System.out.println(minSteps == Integer.MAX_VALUE ? -1 : minSteps);
        sc.close();
    }
}

原创

版权声明:本博客原创文章,由 裴先生 2022年04月22日 发表。
转载说明:除特殊说明外本站文章皆由 CC BY-NC-SA 4.0 协议发布,转载须注明出处。


评论