13.走到数组最后一个成员所使用的最小步骤数

一个正整数数组 设为nums,最大为100个成员,求从第一个成员开始正好走到数组最后一个成员所使用的最小步骤数
3 5 9 4 2 6 8 3 5 4 3 9

要求:

1. 第一步 必须从第一元素起 且 1<=第一步步长<len/2 (len为数组长度)

2. 从第二步开始只能以所在成员的数字走相应的步数,不能多不能少,如果目标不可达返回-1,只输出最小的步骤数量

3. 只能向数组的尾部走不能向回走

 

输入描述:
有正整数数组 空格分割,数组长度<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

 

查看代码

import java.util.*;

public class Demo13 {
    static int  step;
    static int[] ints;

    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        String[] split = sc.nextLine().split(" ");

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

        //尝试存在的可能性
        TreeSet<Integer> set= new TreeSet<>();
        for(int i = 1; i < len / 2; i++){
            step = 1;
            set.add(getSteps(i));
        }

        if(set.size() > 1){
            set.pollFirst();
            System.out.print(set.first());
        }else{
            System.out.println(-1);
        }
    }

    //辅助函数,用来处理每一次尝试的过程
    private static int getSteps(int curPos){
        if(curPos <= ints.length - 1){ //要先判断是否超出数组范围
            int stepNum = ints[curPos];
            if(curPos == ints.length - 1)
                return step;
            else if(curPos < ints.length - 1){
                step++;
                return getSteps(curPos + stepNum);  //这里一定要加return
            }
        }
        return -1;
    }
}

 

总结:使用递归还是不够清晰,对return语句的使用模糊就是对递归本质的模糊。

posted @ 2022-03-25 15:19  Jukim  阅读(459)  评论(0编辑  收藏  举报