华为上机考试真题 2022找终点
Posted Linux猿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机考试真题 2022找终点相关的知识,希望对你有一定的参考价值。
🎈 作者:Linux猿
🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!
🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀
🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬
目录
注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系删除!
一、题目描述
给定一个正整数数组,最大为100个成员,从第一个成员开始,走到数组最后一个成员最少的步骤数。第一步必须从第一元素开始,1<=步长<len/2, 第二步开始以所在成员的数字走相应的步数,如果目标不可达返回-1,只输出最少的步骤数。
1.1 输入描述
由正整数组成的数组,以空格分隔,数组长度小于100,请自行解析数据数量。
1.2 输出描述
正整数,表示最少的步数,如果不存在输出 -1。
1.3 样例输入
7 5 9 4 2 6 8 3 5 4 3 9
1.3 样例输出
2
说明:第一步走2步(2<len/2),走到 9,第二步走 9 步到底最后一个成员,最少步数两步,其中,len 为数组长度。
🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶
二、解题思路
本题首先需要将输入数据解析成整数的数组,因为第一步的步长为 1 <= 步长 < len/2,第二步以后就是对应数组下标的步长,可以遍历步长为 1 <= 步长 < len/2 的情况,每种情况都计算到达终点的步数,并记录最小值。
注意:到达终点需要正好到达最后一个位置,所有情况都不满足返回 -1。
例如样例输入的情况:
7 5 9 4 2 6 8 3 5 4 3 9
那么,所有的遍历情况如下所示:
第一步:1 <= 步长 < 12/2
第一步走一步的情况:
从 5 -> 8 -> 超出范围。
第一步走两步的情况:
从 9 -> 9 正好到达终点,需要两个步骤。
第一步走三步的情况:
从 4 -> 3 -> 3 -> 超出范围;
第一步走四步的情况:
从 2 -> 8 -> 超出范围;
第一步走五步的情况:
从 6 -> 9 正好到达终点,需要两个步骤。
综上所述,最少需要两个步骤。
🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶
三、代码实现
代码实现如下所示。
#include <iostream>
#include <vector>
using namespace std;
const int SIZE = 105;
/**
* 解析输入
*/
void input(string str, vector<int>& g)
int sum = 0;
for (int i = 0; i < (int)str.size(); ++i)
if (str[i] == ' ')
g.push_back(sum);
sum = 0;
continue;
sum = sum * 10 + str[i] - '0';
g.push_back(sum);
/**
* 求解最小步骤
*/
int minStep(vector<int>& g)
int ans = SIZE;
int n = g.size();
for (int i = 1; i < n / 2; ++i)
int step = 0;
for (int j = i; ; j += g[j])
step++;
if (j == n - 1)
ans = min(ans, step);
break;
if (j >= n)
step = SIZE;
break;
return ans == SIZE ? -1 : ans;
int main()
string str;
while (getline(cin, str))
vector<int>g;
input(str, g);
int ans = minStep(g);
cout<<ans<<endl;
return 0;
🔶🔶🔶🔶🔶 我是华丽的分割线 🔶🔶🔶🔶🔶
四、时间复杂度
时间复杂度:O(n^2)。
在上述代码中,通过两层 for 循环遍历,计算最小步骤,其中,第一个 for 循环时间复杂度为 O(n/2),第二个时间复杂度约为 O(n),所以总的时间复杂度约为 O(n^2)。
🎈 感觉有帮助记得「一键三连」支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章」回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞
以上是关于华为上机考试真题 2022找终点的主要内容,如果未能解决你的问题,请参考以下文章