• 华为OD机考算法题:找终点


    目录

    题目部分

    解读与分析

    代码实现


    题目部分

    题目找终点
    难度
    题目说明给定一个正整数数组,设为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,从第一个成员开始走 2 步,到达 9;
    第二步:从 9 开始,经过自身数字 9 对应的 9 个成员到最后。 
    示例2
    输入1 2 3 7 1 5 9 3 2 1
    输出-1
    说明


    解读与分析

    题目解读

    整形数组的长度为 len,第一步的大小可以是 [1, len/2) 中的任意一个数字,第二步和第二步以后的步数只能为当前成员的数字。

    分析与思路

    题目中,第一步是可选的数字,一旦第一步数字固定了,后面的所有步数都是固定的。所以,此题可变的是第一步的步数,我们可以尝试第一步所有的可能的步数,计算所有能到达最后的步数,输出这些步数中的最小值即可。如果第一步尝试了所有可能的步数,全都无法达到最后一步,则输出 -1。

    以上方法的时间复杂度为O(n^{2})。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. /**
    3. * 篮球比赛
    4. * @since 2023.10.08
    5. * @version 0.1
    6. * @author Frank
    7. *
    8. */
    9. public class FindEnd {
    10. public static void main(String[] args) {
    11. Scanner sc = new Scanner(System.in);
    12. while (sc.hasNext()) {
    13. String input = sc.nextLine();
    14. String[] numbersStr = input.split( " " );
    15. processFindEnd( numbersStr );
    16. }
    17. }
    18. private static void processFindEnd( String numbersStr[] )
    19. {
    20. int count = numbersStr.length;
    21. int[] numbers = new int[count];
    22. for( int i = 0; i < count; i ++ )
    23. {
    24. numbers[i] = Integer.parseInt( numbersStr[i] );
    25. }
    26. int minSteps = Integer.MAX_VALUE;
    27. for( int i = 1; i < count * 1.0 / 2; i ++ )
    28. {
    29. int steps = 1;
    30. int next = i;
    31. while( next < count -1 )
    32. {
    33. steps ++;
    34. next = next + numbers[next];
    35. if( next == count -1 )
    36. {
    37. if( steps < minSteps )
    38. {
    39. minSteps = steps;
    40. }
    41. break;
    42. }
    43. }
    44. }
    45. if( minSteps == Integer.MAX_VALUE )
    46. {
    47. minSteps = -1;
    48. }
    49. System.out.println( minSteps );
    50. }
    51. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. var numberArr = line.split(" ");
    7. processFindEnd(numberArr);
    8. }
    9. }();
    10. function processFindEnd(numbersStr) {
    11. var count = numbersStr.length;
    12. var numbers = new Array();
    13. for (var i = 0; i < count; i++) {
    14. numbers[i] = parseInt(numbersStr[i]);
    15. }
    16. var minSteps = Number.MAX_VALUE;
    17. for (var i = 1; i < count / 2; i++) {
    18. var steps = 1;
    19. var next = i;
    20. while (next < count - 1) {
    21. steps++;
    22. next = next + numbers[next];
    23. if (next == count - 1) {
    24. if (steps < minSteps) {
    25. minSteps = steps;
    26. }
    27. break;
    28. }
    29. }
    30. }
    31. if (minSteps == Number.MAX_VALUE) {
    32. minSteps = -1;
    33. }
    34. console.log(minSteps);
    35. }

    (完)

  • 相关阅读:
    6-4布线问题(分支限界)
    项目完成 - 基于Django3.x版本 - 开发部署小结
    面向边缘场景的 PWA 实践
    查看mysql数据库的版本
    一文带你了解容器技术的前世今生
    java 短路运算符用法 和 短路运算符的好处
    前端学习笔记——第三天
    thinkphp学习10-数据库的修改删除
    ros gazebo相关包的安装
    Duplicate entry ‘1559098812383174658‘ for key ‘rc_amt_contributions.PRIMARY‘
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133676762