4.14 华为笔试题解

题目比较简单,一共三道题,leetcode medium难度。前两道题都全A了。第三道题是lc45,我A了95%,有一个用例没有通过,但是把code贴到lc是能过的。可能题目和原题还是不太一样吧。有懂的大佬可以说说这个用例是咋回事。

反转字符串

题目

将()中的字符串翻转,并在输出中删除括号。括号可迭代,如输入为 (uoy(love)i),输出为(iloveyou)。先翻转内层括号,再翻转外层括号。输出要删除掉所有括号。我感觉这题是今天最难的一题。。

code

思路为栈。用栈维护 '(' 的下标,遇到 ')' 出栈,并翻转之间的子串。
#include<bits/stdc++.h>
using namespace std;


void swap(char& a, char& b){
    char t = a;
    a = b;
    b = t;
}

void reverse(string& s, int l, int r){
    while(l<r)
    {
        swap(s[l], s[r]);
        l++;
        r--;
    }
}

string stringCore(string& s){
    int len = s.length();
    stack<int> leftP;
    string ret = "";
    for(int i=0;i<len;i++)
    {
        if(s[i]=='(')
            leftP.push(ret.size());
        else if(s[i]==')')
        {
            int l = leftP.top();
            leftP.pop();
            reverse(ret, l, ret.size()-1);
        }
        else{
            ret += s[i];
        }      
    }
    return ret;
}


int main(){
    //string s;
    //cin>>s;
    string s = "(((asdfg)asdfg)asdfg(asdfg)asdfg)asdfg(asdfghjkl)";
    cout<<stringCore(s)<<endl;
}

自动驾驶计速

题目

题目比较复杂,我这里就不写了。
大概是一个考验代码能力的设计类题目,需要注意的是AEB结束后的2s内是需要判断下一次AEB的。要点见注释。

code

#include<bits/stdc++.h>
using namespace std;

vector<int> uploadSpeeds(vector<int>& speed){
    vector<int> ret;
    int len = speed.size();
    
    int lastAEB = -1; //prevent repeating report
    int timer = 1; //normal timer
    int curAEB = 0; //the timer for AEB
    bool AEB = false; //is current AEB
    ret.push_back(speed[0]);
    for(int i=1;i<len;i++)
    {
        //在AEB状态下,单独处理
        if(AEB==true)
        {
            //判断AEB结束
            if(speed[i-1]-speed[i]<9)
            {
                for(int j=0;j<4;j++)
                    if(i+j<len)
                    {
                        ret.push_back(speed[i+j]);
                        //这里需要注意,在AEB结束的2s内是需要判断下一次AEB的
                        if(speed[i+j-1]-speed[i+j]>=9)
                            curAEB++;
                        else
                            curAEB==0;
                    }
                timer = 0;
                lastAEB = i+3;
                i += 3;
                AEB = false;
            }
            else{
                ret.push_back(speed[i]);
            }
        }
        //判断AEB开始
        else if(speed[i-1]-speed[i]>=9)
        {
            curAEB++;
            if(curAEB>=4){
                curAEB = 0;
                AEB = true;
                timer = 0;
                //找前四个点,看是不是比上一次的末尾大,推入
                for(int j=i-7;j<=i;j++)
                    if(j>lastAEB)
                        ret.push_back(speed[j]);
                
            }
        }
        else
            curAEB = 0;
        //正常计速
        if(timer==60&&!AEB)
        {
            timer = 0;
            ret.push_back(speed[i]);
        }
        timer++;
    }
    
    
    return ret;
}

int main(){
    int n;
    cin>>n;
    vector<int> speed(n);
    for(int i=0;i<n;i++)
    {
        cin>>speed[i];
    }
    vector<int> upload = uploadSpeeds(speed);
    int len = upload.size();
    for(int i =0;i<len-1;i++)
        cout<<upload[i]<<',';
    cout<<upload[len-1]<<endl;
}


跳跃游戏II

题目

见LC45。题目大概是一样的,可能有一个小小的区别,导致有1个样例我没有通过。但是我没有发现这个区别。

code

贪心算法。每次循环遍历当前位置到可达的最大位置,并更新下一次遍历的最大位置。
#include<bits/stdc++.h>
using namespace std;

int minTrans(vector<int>& dev){
    int ret = 0;
    int maxGet = 0;
    int pre = 0;
    while(maxGet<dev.size()-1)
    {
        int curGet = maxGet;
        for(int i=pre;i<=curGet;i++)
        {
            maxGet = max(maxGet, dev[i]+i);
        }
        ret++;
        pre = curGet+1;
    }

    return ret;
}

int main(){
    while(true){
        int n;
        cin>>n;
        vector<int> dev(n);
        for(int i=0;i<n;i++)
        {
            cin>>dev[i];
        }
        cout<<minTrans(dev)<<endl;
        }
}




#笔经##华为##C++工程师#
全部评论
跳跃游戏那是妥妥的动态规划问题。
点赞 回复 分享
发布于 2021-05-14 09:08
。。第二题过了60%,三个用例都能过。。不知道啥情况
点赞 回复 分享
发布于 2021-04-15 00:26
哎,第一题搞了半天没搞出来,笔试完回来一下就做出来了,还是自己太菜了
点赞 回复 分享
发布于 2021-04-14 23:21

相关推荐

02-28 01:18
已编辑
南昌大学 后端工程师
后测速成辅导一两个月...:把开源经历放个人项目上边应该更好,就像大部分人都把实习经历放个人项目上边
点赞 评论 收藏
分享
03-11 23:33
已编辑
曲阜师范大学 后端工程师
牛客68808588...:果真开发过12306购票系统吗,这不是一眼就被看穿了
点赞 评论 收藏
分享
评论
7
44
分享

创作者周榜

更多
正在热议
更多
# 春招至今,你的战绩如何? #
9757次浏览 91人参与
# 你的实习产出是真实的还是包装的? #
1758次浏览 40人参与
# 米连集团26产品管培生项目 #
5761次浏览 214人参与
# 军工所铁饭碗 vs 互联网高薪资,你会选谁 #
7464次浏览 43人参与
# 简历第一个项目做什么 #
31568次浏览 330人参与
# 重来一次,我还会选择这个专业吗 #
433365次浏览 3926人参与
# MiniMax求职进展汇总 #
23859次浏览 308人参与
# 当下环境,你会继续卷互联网,还是看其他行业机会 #
186990次浏览 1122人参与
# 牛客AI文生图 #
21408次浏览 238人参与
# 不考虑薪资和职业,你最想做什么工作呢? #
152293次浏览 887人参与
# 研究所笔面经互助 #
118873次浏览 577人参与
# 简历中的项目经历要怎么写? #
310079次浏览 4194人参与
# AI时代,哪些岗位最容易被淘汰 #
63432次浏览 804人参与
# 面试紧张时你会有什么表现? #
30490次浏览 188人参与
# 你今年的平均薪资是多少? #
213013次浏览 1039人参与
# 你怎么看待AI面试 #
179875次浏览 1235人参与
# 高学历就一定能找到好工作吗? #
64313次浏览 620人参与
# 你最满意的offer薪资是哪家公司? #
76438次浏览 374人参与
# 我的求职精神状态 #
447988次浏览 3128人参与
# 正在春招的你,也参与了去年秋招吗? #
363256次浏览 2637人参与
# 腾讯音乐求职进展汇总 #
160585次浏览 1111人参与
# 校招笔试 #
470477次浏览 2964人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务