华为OD机试之找终点

找终点

题目描述

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

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

输入描述

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

输出描述

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

用例

输入 7 5 9 4 2 6 8 3 5 4 3 9
输出 2
说明

第一步: 第一个可选步长选择2,从第一个成员7开始走2步,到达9;

第二步: 从9开始,经过自身数字9对应的9个成员到最后。

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

源码和解析
解析:

  1. 理解题目
  2. 通过不断地切换第一步的步数,来找到步数最少且刚好达到末尾

示例代码:

import java.util.ArrayList;
import java.util.List;

public class T48 {
	public static boolean flag;// 是否存在 默认为false

	public static void main(String[] args) {
		String input = "1 2 3 7 1 5 9 3 2 1 2"; // "1 2 3 7 1 5 9 3 2 1";//
												// "7 5 9 4 2 6 8 3 5 4 3 9";
		List<Integer> nums = new ArrayList<Integer>();
		for (String str : input.split(" ")) {
			nums.add(Integer.parseInt(str));
		}
		System.out.println(nums);
		int res = dfs(nums);
		if (flag)
			System.out.println("结果为:" + res);
		if (!flag)
			System.out.println("结果为:-1");
	}

	public static int dfs(List<Integer> nums) {
		int objCount = nums.size();// 步数数量
		int stype = 0;// 第几步
		if (nums.get(0) <= 0) {// 第一个数 可能 负数或0 那么步子无法迈出去
			return -1;
		}
		for (stype = 1; stype < nums.size() / 2; stype++) {
			boolean f = false;// 第一步位stype 看下是否能移动到nums的最后一个成员
			int tempStype = stype;
			int index = 0;// 移动的索引
			int count = 0;// 一开始就第一步 后面每挪动一次就加1
			int tempCount = 0;
			while (tempStype < nums.size()) {
				index += tempStype;
				// System.out.println("index:"+index+" tempStype:"+tempStype);;
				count++;
				if (index == nums.size() - 1) {
					tempCount = count;
					// System.out.println("找到了,第一步为" + stype+"步数为"+count);
					f = true;
				} else if (index < nums.size()) {
					tempStype = nums.get(index);
				} else {
					// 越界了 没找到
					break;
				}
			}
			if (f) {
				flag = true;
				if (objCount > tempCount) {
					objCount = tempCount;
				}
			}

		}
		return objCount;
	}
}

代码运行示意图
华为OD机试之找终点_第1张图片
在这里插入图片描述
华为OD机试之找终点_第2张图片

你可能感兴趣的:(华为OD机试,深度优先,java,算法,华为OD)