华为上机真题 2021分子弹

Posted Linux猿

tags:

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


🎈 作者:Linux猿

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

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

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


目录

一、题目描述

1.1 输入描述

1.2 输出描述

1.3 测试样例

二、解题思路

三、代码实现

四、时间复杂度


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

一、题目描述

射击训练,需要给每个士兵发子弹,发子弹的个数规则是根据士兵的训练成绩给定的,传入士兵的训练成绩,要求相邻士兵中,成绩好的士兵的子弹数必须更多,每个士兵至少分配一个子弹。

1.1 输入描述

输入每个士兵的训练成绩,如 1,2,3,代表 3 位士兵的成绩分别为 1,2,3。

1.2 输出描述

最少分配的子弹数。

1.3 测试样例

输入

1,2,2

输出

4

二、解题思路

本题实质上计算的是每个人左右两边单调递减的最大长度。那么,可以从左向右遍历计算每个人左边单调递减的最大长度,然后从右向左计算每个人右边单调递减的最大长度,然后取最大值即可。

三、代码实现

代码实现如下所示。

#include <iostream>
#include <sstream>
#include <vector>
using namespace std;

vector<int> parseData(string str)

    vector<int> ret;
    stringstream stream(str);
    while (stream.good()) 
      string strTmp;
      getline(stream, strTmp, ',');
      ret.push_back(atoi(strTmp.c_str()));
    
    return ret;


int solve(string str)

    auto g = parseData(str);
    int n = g.size();
    vector<int> left(n);
    for (int i = 0; i < n; i++) 
        if (i > 0 && g[i] > g[i - 1]) 
            left[i] = left[i - 1] + 1;
         else 
            left[i] = 1;
        
    

    int right = 0, ret = 0;
    for (int i = n - 1; i >= 0; i--) 
        if (i < n - 1 && g[i] > g[i + 1]) 
            right++;
         else 
            right = 1;
        
        ret += max(left[i], right);
    
    return ret;


int main()

    string str;
    while (cin>>str) 
        int ans = solve(str);
        cout<<ans<<endl;
    
    return 0;

四、时间复杂度

时间复杂度:O(n)

其中 n 是子弹的数量。遍历两次数组分别计算从左到右和从右到左每个人应该分子弹的数量。

空间复杂度:O(n)

其中 n 是子弹的数量。保存从左边遍历每人应该分子弹的数量。


🎈 感觉有帮助记得「一键三连支持下哦!有问题可在评论区留言💬,感谢大家的一路支持!🤞猿哥将持续输出「优质文章回馈大家!🤞🌹🌹🌹🌹🌹🌹🤞


以上是关于华为上机真题 2021分子弹的主要内容,如果未能解决你的问题,请参考以下文章

华为OD机试真题 JS 实现士兵过河2023 Q1 | 200分

华为OD机试真题 Python 实现士兵过河2022.11 Q4 新题

华为OD机试真题 Java 实现士兵过河2022.11 Q4 新题

华为OD机试真题 C++ 实现士兵过河2022.11 Q4 新题

华为上机真题区间交集

华为上机真题事件推送