华为OD机试真题---找终点

华为OD机试真题“找终点”是一道考察算法思维和编程能力的题目。题目大意是给定一个正整数数组,要求从数组的第一个元素开始,通过每一步跳跃(跳跃步数由当前所在元素的值决定)到达数组的最后一个元素,并计算最少的步骤数。如果无法到达数组的最后一个元素,则返回-1。

题目描述

  • 输入:一个正整数数组,数组长度小于100,数组中的元素代表从当前位置可以跳跃的步数。
  • 输出:最少的步骤数,如果无法到达终点则返回-1。

解题思路

  1. 初始化

    • 创建一个数组来存储正整数。
    • 初始化一个变量来记录最小步数,初始值可以设置为一个较大的数(如数组长度加1,以便后续判断是否可达)。
  2. 遍历第一步的步长

    • 由于第一步的步长必须在1到数组长度的一半之间(包括1但不包括数组长度的一半),因此需要对这个范围内的步长进行遍历。
  3. 尝试到达终点

    • 对于每个可能的第一步步长,从数组的第一个元素开始,按照当前元素的值进行跳跃,直到无法继续跳跃或到达终点。
    • 在跳跃过程中,记录步数,并在每次跳跃后更新当前位置。
  4. 判断并更新最小步数

    • 如果在某次跳跃中成功到达终点,则比较当前步数与之前记录的最小步数,并更新最小步数(如果更小的话)。
  5. 输出结果

    • 遍历完所有可能的第一步步长后,检查最小步数是否仍然保持为初始值(即未找到可达路径),如果是,则输出-1;否则,输出最小步数。

示例

输入7 5 9 4 2 6 8 3 5 4 3 9

输出2(第一步跳5步到第二个元素9,第二步从9开始跳9步到达终点)

注意事项

  • 题目要求的是最少的步骤数,因此需要遍历所有可能的第一步步长来找到最优解。
  • 如果数组中的某个元素值为0,且该元素不是最后一个元素,则可能无法从该元素继续跳跃,需要特别注意这种情况。
  • 在编程实现时,要注意数组越界的问题,确保在跳跃过程中不会访问到数组范围之外的元素。

编程实现(示例代码,以Java为例)


import java.util.Arrays;
import java.util.List;public class FindFinish {public static void main(String[] args) {List<Integer> nums = Arrays.asList(7, 5, 9, 4, 2, 6, 8, 3, 5, 4, 3, 9);int result = findFinish(nums);System.out.println("最小步数:"+result);}public static int findFinish(List<Integer> nums) {int n = nums.size();if (n == 0) return -1;int minSteps = n + 1; // 初始化为一个较大的数for (int firstStep = 1; firstStep < n / 2; firstStep++) {int steps = 1; // 记录步数,第一步已经迈出int currentIndex = firstStep;while (currentIndex < n) {currentIndex += nums.get(currentIndex);steps++;if (currentIndex == n - 1) {minSteps = Math.min(minSteps, steps);break;}}}return minSteps == n + 1 ? -1 : minSteps;}
}

注意:上述代码虽然能实现题目要求,输出最小步数。但仔细分析就会发现代码其实是有问题的。

潜在问题及修改建议:

1、数组越界问题:在循环中 currentIndex += nums.get(currentIndex) 可能导致数组越界。如果nums.get(currentIndex) 的值非常大,currentIndex 可能会超过 n - 1,从而导致 List 越界访问。

  • 修改建议:在每次增加 currentIndex 前,先检查是否越界。

2、逻辑 Bug:当 firstStep 设置为 n / 2 时,可能会错过某些可能的路径。虽然题目没有明确说明,但从逻辑上讲,firstStep 应该遍历到 n-1 才能覆盖所有可能的情况。

  • 修改建议:将 for 循环条件改为 firstStep <= n - 1。

优化方向及修改建议:

1、初始化 minSteps 的值:初始值 n + 1 可以简化为 Integer.MAX_VALUE,这样更直观且不容易出错。

  • 修改建议:使用 Integer.MAX_VALUE 初始化 minSteps。

2、提高代码可读性:通过添加注释来提高代码的可读性和维护性。

  • 修改建议:在关键逻辑处添加注释。

3、减少不必要的循环次数:在 while 循环内部,如果 currentIndex 超过 n - 1,则可以直接跳出循环,避免无意义的计算。

  • 修改建议:在 while 循环内部添加判断条件。

以下是修改后的代码:

public static int findFinish(List<Integer> nums) {int n = nums.size();if (n == 0) return -1;int minSteps = Integer.MAX_VALUE; // 初始化为一个极大的数// 遍历所有可能的第一步for (int firstStep = 1; firstStep <= n - 1; firstStep++) {int steps = 1; // 记录步数,第一步已经迈出int currentIndex = firstStep;// 当前索引不超过数组长度时继续计算while (currentIndex < n) {// 防止数组越界if (currentIndex + nums.get(currentIndex) >= n) {break;}currentIndex += nums.get(currentIndex);steps++;if (currentIndex == n - 1) {minSteps = Math.min(minSteps, steps);break;}}}return minSteps == Integer.MAX_VALUE ? -1 : minSteps;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1551873.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; class Solution:def findDisappearedNumbers(self, nums: List[int]) -> List[int]:n len(nums)for num in nums:x (num - 1) % nnums[x] nret [i 1 for i, num in enumerate(nums) if num < n]return ret

【RocketMQ】秒杀设计与实现

&#x1f3af; 导读&#xff1a;本文档详细探讨了高并发场景下的秒杀系统设计与优化策略&#xff0c;特别是如何在短时间内处理大量请求。文档分析了系统性能指标如QPS&#xff08;每秒查询率&#xff09;和TPS&#xff08;每秒事务数&#xff09;&#xff0c;并通过实例讲解了…

鸿蒙开发(NEXT/API 12)【申请接入Wear Engine服务】 穿戴服务

申请Wear Engine服务前&#xff08;开发者需实名认证为个人开发者或者企业开发者&#xff0c;认证前&#xff0c;请先了解二者的[权益区别] &#xff09;&#xff0c;确认开发环境并完成创建项目、创建HarmonyOS应用等基本准备工作&#xff0c;再继续进行以下开发活动。 进入华…

JVM(HotSpot):字符串常量池(StringTable)

文章目录 一、内存结构图二、案例讲解三、总结 一、内存结构图 JDK1.6 JDK1.8 我们发现&#xff0c;StringTable移入了Heap里面。所以&#xff0c;应该想到&#xff0c;StringTable将受到GC管理。 其实&#xff0c;1.6中&#xff0c;在方法区中的时候&#xff0c;也是受GC管…

Android Studio 新版本 Logcat 的使用详解

点击进入官方Logcat介绍 一个好的Android程序员要会使用AndroidStudio自带的Logcat查看日志&#xff0c;会Log定位也是查找程序bug的第一关键。同时Logcat是一个查看和处理日志消息的工具&#xff0c;它可以更快的帮助开发者调试应用程序。 步入正题&#xff0c;看图说话。 点…

Linux 之 IO模型

IO的本质是基于操作系统接口来控制底层的硬件之间数据传输&#xff0c;并且在操作系统中实现了多种不同的IO方式&#xff08;模型&#xff09;&#xff0c;比较常见的有下列三种 阻塞型IO模型 非阻塞型IO模型 多路复用IO模型 一、阻塞与非阻塞IO 一般默认的 IO 操作都是阻塞…

在Linux中进行OpenSSH升级(编译安装在openssh目录)

由于OpenSSH有严重漏洞&#xff0c;因此需要升级OpenSSH到最新版本。 注意&#xff1a;在OpenSSH升级过程中千万不要断开服务器连接&#xff0c;不然的话&#xff0c;会出现断开后连接不了服务器的情况。 第一步&#xff0c;查看当前的OpenSSH服务版本。 命令&#xff1a;ss…

DataEase v2 开源代码 Windows 从0到1环境搭建

一、环境准备 功能名称 描述 其它 操作系统 Windows 数据库 Mysql8.0 开发环境 JDK17以上 本项基于的21版本开发 Maven 3.9版本 开发工具 idea2024.2版本 前端 VSCode TIPS&#xff1a;如果你本地有jdk8版本&#xff0c;需要切换21版本&#xff0c;请看…

C语言 | Leetcode C语言题解之第448题找到所有数组中消失的数字

题目&#xff1a; 题解&#xff1a; int* findDisappearedNumbers(int* nums, int numsSize, int* returnSize) {for (int i 0; i < numsSize; i) {int x (nums[i] - 1) % numsSize;nums[x] numsSize;}int* ret malloc(sizeof(int) * numsSize);*returnSize 0;for (in…

遥感图像文本检索

遥感图像文本检索是一种通过自然语言描述&#xff0c;从大量遥感图像中搜索与之相关的图像的技术。它用于遥感解释任务中&#xff0c;帮助用户根据文字描述快速找到符合条件的遥感图像&#xff0c;这在城市规划、环境监测、灾害管理等领域具有重要应用意义。 实现这一技术的核…

线路交换与分组交换的深度解析

1. 线路交换 原理 线路交换是一种在通信双方之间建立固定通信路径的方式。当用户发起通信时&#xff0c;网络为其分配一条专用的物理通道&#xff0c;这条通道在整个通话过程中保持不变。这意味着在通话期间&#xff0c;其他用户无法使用这条线路。 优点 稳定性&#xff1a…

记录一次出现循环依赖问题

具体的结构设计&#xff1a; 在上面的图片中&#xff1a; UnboundBlackVerifyChain类中继承了UnboundChain类。但是UnboundChain类中注入了下面三个类。 Scope(“prototype”) UnboundLinkFlowCheck类 Scope(“prototype”) UnboundUserNameCheck类 Scope(“prototype”) Un…

【刷题6】一维前缀和、二维前缀和

目录 一、一维前缀和二、二维前缀和 一、一维前缀和 题目&#xff1a; 思路&#xff1a; 一、前缀和&#xff0c;时间复杂度O&#xff08;1&#xff09;&#xff0c;快速得到区间的值 二、预处理&#xff0c;公式——dp[i] dp[i-1] arr[i] 三、使用前缀和&#xff0c;根据…

VUE a-table 动态拖动修改列宽+固定列

实现效果 实现思路 自定义表头&#xff0c;在标题后面加两个标签&#xff0c;分别用来显示拖拽图标&#xff08;cursor: col-resize&#xff09;&#xff0c;和蓝色标记线&#xff08;有的时候鼠标移动过程中不一定会在表内&#xff0c;这个时候不显示图标&#xff0c;只显示蓝…

综合练习 学习案例

//验证码 前四位是字母 最后一位是数字 public class test1 {public static void main(String[] args){char [] charsnew char[52];for (int i 0; i <chars.length ; i) {if(i<25){chars[i](char)(i97);}else{chars[i](char)(i65-26);}}Random rnew Random();String cod…

828华为云征文|华为云Flexus云服务器X实例部署 即时通讯IM聊天交友软件——高性能服务器实现120W并发连接

营运版的即时通讯IM聊天交友系统&#xff1a;特点可发红包&#xff0c;可添加多条链接到用户网站和应用&#xff0c;安卓苹果APPPC端H5四合一 后端开发语言&#xff1a;PHP&#xff0c; 前端开发语言&#xff1a;uniapp混合开发。 集安卓苹果APPPC端H5四合一APP源码&#xff0…

语音转文字免费利器:助力高效办公与学习

语音转文字免费的软件如同一股清流&#xff0c;让我们能够更轻松地将语音信息转化为可编辑的文字内容。今天我们一起来分析它们的功能、特点以及如何为我们的生活和工作带来便利。 1.365在线转文字 链接直达&#xff1a;https://www.pdf365.cn/ 这是一个功能强大的在线工具…

量化必备!股票常用数据批量下载、定时更新,代码打包好了!

上一节课我详细演示了从tushare获取股票列表和基本信息并且配置定时更新任务的详细流程&#xff0c;旨在教会想要学习通过Python获取股票数据并且定期更新的朋友。 不过有很多朋友完全没有Python基础&#xff0c;如果一开始把大量时间花费在搞数据上&#xff0c;本末倒置不说&…

如果您忘记了 Apple ID 和密码,按照指南可重新进入您的设备

即使您的 iPhone 或 iPad 由于各种原因被锁定或禁用&#xff0c;也可以使用 iTunes、“查找我的”、Apple 支持和 iCloud 解锁您的设备。但是&#xff0c;此过程需要您的 Apple ID 和密码来验证所有权并移除激活锁。如果您忘记了 Apple ID 和密码&#xff0c;请按照我们的指南重…

【PyTorch】图像分割

图像分割是什么 Image Segmentation 将图像每一个像素分类 图像分割分类 超像素分割&#xff1a;少量超像素代替大量像素&#xff0c;常用于图像预处理语义分割&#xff1a;逐像素分类&#xff0c;无法区分个体实例分割&#xff1a;对个体目标进行分割全景分割&#xff1a;…