华为上机考试真题 2022找终点

Posted Linux猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为上机考试真题 2022找终点相关的知识,希望对你有一定的参考价值。


🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、云计算、物联网、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 关注专栏: 数据结构和算法成神路【精讲】优质好文持续更新中……🚀🚀🚀

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 样例输入

1.3 样例输出

二、解题思路

三、代码实现

四、时间复杂度


注意:题目来源于网络用户分享,本文仅分享做题思路和方法,如有侵权请联系删除!

一、题目描述

给定一个正整数数组,最大为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找终点的主要内容,如果未能解决你的问题,请参考以下文章

华为上机考试真题 2022最大整数

华为机试真题 C++ 实现找终点

华为OD机试真题 Python 实现找终点

华为OD机试题,用 Java 解找终点问题

华为上机考试真题汽水瓶

华为上机真题 2022玩牌高手